比如在线程体里写着一个循环,判断显示隐藏窗口的条件: showflag=true ,在隐藏窗口显示后的点击按钮将把showflag置为false然后线程函数内写着:if showflag then 隐藏窗口.visible := true;
while showflag do
sleep(1000)---
但是这样这样子显示隐藏窗口后主窗口会非常卡,请问这是为什么?
while showflag do
sleep(1000)---
但是这样这样子显示隐藏窗口后主窗口会非常卡,请问这是为什么?
1是线程没有退出结束的条件;
2是if showflag then 隐藏窗口.visible := true;没有在循环里面,所以只能执行一次。
3是你都sleep(1000)了,能不卡嘛~~
while not terminted do
begin
xx.visible := showflag;
sleep(10);
Application.processmessages;
end;
你把你代码贴出来看看,我上面写的是根据你那一点儿代码提出的~~
你最好创建一个事件内核对象,然后在这个辅助线程中等待这个内核对象,当你主线程中按下按钮之后,你就设置这个对象为通知状态,那么这个辅助线程中的等待函数就会返回。
等待函数在等待的时候,会将线程挂起,这样不占用cpu以及系统资源。而你现在实现的方法是不停地循环,这样会浪费不必要的时间。而且响应速度也没有使用等待函数来的快。还有,所谓的主线程,不过是因为这个线程创建了主窗体,而之所以说他上主窗体,是因为这个窗体如果关闭,他会顺带结束整个进程。
哪个线程创建的窗体,这个窗体就归哪个线程,线程一旦结束,他所创建的所有的创建都将被释放。顺带说一句:消息队列是线程的,不是窗体的,一个线程可以创建N多窗体,但是一个线程只有一个消息队列,这个线程负责派发消息队列中的消息到不同的窗体中去。
在你初始化 showflag 的地方或者在主窗体的 OnCreate 事件中创建一个人工重置未通知的事件内核对象
hEvent := CreateEvent(nil, True, False, nil);在你的辅助线程中
while not terminted do
begin
case WaitForSingleObject(hEvent, INFINITE) of
WAIT_OBJECT_0:
begin
ResetEvent(hEvent);
隐藏窗口.Visible := True
end;
else
Break;
end;
end;在你设置showflag的按钮下,换成如下语句
SetEvent(hEvent)这就可以了
辅助线程.Terminate;
SetEvent(hEvent);
CloseHandle(hEvent);