比如在线程体里写着一个循环,判断显示隐藏窗口的条件: showflag=true ,在隐藏窗口显示后的点击按钮将把showflag置为false然后线程函数内写着:if showflag then 隐藏窗口.visible := true;
while  showflag do
 sleep(1000)---
但是这样这样子显示隐藏窗口后主窗口会非常卡,请问这是为什么?

解决方案 »

  1.   

    有几个问题:
    1是线程没有退出结束的条件;
    2是if showflag then 隐藏窗口.visible := true;没有在循环里面,所以只能执行一次。
    3是你都sleep(1000)了,能不卡嘛~~
    while not terminted do
    begin
      xx.visible := showflag;
      sleep(10);
      Application.processmessages;
    end;
      

  2.   

    我是在线程中判断标志,才sleep的啊,退出条件旧showflag=false,也就是那个窗口中点击按钮事件会把它设为false
      

  3.   

    程序卡肯定是因为你sleep时间太长的原因……
    你把你代码贴出来看看,我上面写的是根据你那一点儿代码提出的~~
      

  4.   

    不建议你在循环中,用Boolean变量来实现监测。
    你最好创建一个事件内核对象,然后在这个辅助线程中等待这个内核对象,当你主线程中按下按钮之后,你就设置这个对象为通知状态,那么这个辅助线程中的等待函数就会返回。
    等待函数在等待的时候,会将线程挂起,这样不占用cpu以及系统资源。而你现在实现的方法是不停地循环,这样会浪费不必要的时间。而且响应速度也没有使用等待函数来的快。还有,所谓的主线程,不过是因为这个线程创建了主窗体,而之所以说他上主窗体,是因为这个窗体如果关闭,他会顺带结束整个进程。
    哪个线程创建的窗体,这个窗体就归哪个线程,线程一旦结束,他所创建的所有的创建都将被释放。顺带说一句:消息队列是线程的,不是窗体的,一个线程可以创建N多窗体,但是一个线程只有一个消息队列,这个线程负责派发消息队列中的消息到不同的窗体中去。
      

  5.   

    在你定义 showflag 的地方定义一个事件内核对象 hEvent: THandle
    在你初始化 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)这就可以了
      

  6.   

    在你不需要辅助线程工作的时候,你可以按照如下方式操作
      辅助线程.Terminate;
      SetEvent(hEvent);
      CloseHandle(hEvent);