简单问题,100分送上(100分)

  • 主题发起人 主题发起人 QiuXiaoFeng
  • 开始时间 开始时间
Q

QiuXiaoFeng

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个线程中对一变量循环计数,并将计数值通过EDIT编辑框和使用表单的CANVAS.TEXTOUT
送出,使用edit编辑框输出时,如果此时按住标题框,则线程运行暂停(即计数已经停止),松
开后继续计数,但用画布方法时却基本正常(有时也出错),这时怎么回事?另有一低级问题:
可以象如下这样使用吗: Synchronize (countdsp(i));即线程函数带有参数.
 
1. 鼠标按住标题框后, 窗口转入了drag状态, 当前进程挂起了, 不响应其他消息(除了
屏幕刷新消息), 而edit的text的改变是需要处理很多消息才能实现的, 这时, 在你的线
程中,由于它用synchronize来刷新主进程的, 因此它也挂起了. 而用canvas计数, 只需
要主进程处理屏幕重绘就可以了, 当然没有问题啦
2. 不可以直接这么用. 不过可以有变通的办法. 即用变量代替函数/过程参数, 先把需
要传递的参数写入某个变量, 然后synchronize一个无参数的过程, 其中再将变量作为
参数调用具体实施的函数/过程
 
还想问Another_eYes一个基础问题,回答完,马上给分。
这个问题是关于怎样理解线程这个概念的。
一个线程被创建起来,开始执行Execute方法,照我的理解,线程一直在循环执行
Execute方法,直到线程被挂起或终止,那么怎么样才算线程终止?如果仅仅是Execute
方法运行一遍就算结束,那和我刚才的理解相矛盾!
看如下程序,TCounter1,TCountet2通过事件对象通讯,要求两个线程互为执行条件,
依次循环执行
var CEvent1,Cevent2:Tevent;
procedure TCounter1.Execute;
var i:integer;
begin
while CEvent2.WaitFor(10000)=wrSignaleddo
//等待线程2发出事件信号
begin

CEvent2.ResetEvent ();

for i:=0 to 20000do
begin
j:=i;
Synchronize (countdsp);
end;
CEvent1.SetEvent();
end;
end;

procedure TCounter2.Execute;
var i:integer;
begin

while CEvent1.WaitFor(10000)=wrSignaleddo
//等待线程1发出事件信号
begin
CEvent1.ResetEvent ();

for i:=0 to 20000do
begin
j:=i;
Synchronize (countdsp);
end;
CEvent2.SetEvent ();

end;
end;
我有一个不明白的地方,如果使用While/Do语句则按要求运行,如果用if/then
语句则只运行了一次,但在这里两种语句的用途几乎一样,这好象和我上面提到
的问题有点关系,即一个线程是怎样结束的,在线程等待时,他又在做什么(线程
停止?线程在死循环?)照理说,若在Execute中While条件不成立,Execute就结束
了。书上讲得太笼统,不明白。
 
你理解错误. Execute内容只执行一遍.
 
接受答案了.
 
后退
顶部