子线程更新主窗体进度条,拖动主窗体卡死,求解决 创建了一个子线程,传了一个进度值 totalsent 更新主窗体进度条(FOnProgress),不拖动主窗体这个没问题,但是2、3秒拖动一次主窗体就会停滞卡死,求解决办法,子线程代码如下: EnterCriticalSection(critical1); try totalsent:=totalsent+BytesSent; if Assigned(FOnProgress) then Synchronize( Progress) ; LeaveCriticalSection(critical1); except on e:Exception do begin LeaveCriticalSection(critical1); ShowMessage(e.message); end; end;
[解决办法]
Sleep(100); Application.ProcessMessage;
EnterCriticalSection(critical1); try totalsent:=totalsent+BytesSent; if Assigned(FOnProgress) then Synchronize(Progress) ; Sleep(100); Application.ProcessMessage; LeaveCriticalSection(critical1); except on e:Exception do begin LeaveCriticalSection(critical1); ShowMessage(e.message); end; end;
[解决办法] 线程中最好不要直接去操作窗体,使用消息来进行通知。 postmessage(formHandle,自己的消息,) 窗体收到消息后在进行操作。 [解决办法] [code=delphi] EnterCriticalSection(critical1); try totalsent:=totalsent+BytesSent; finally LeaveCriticalSection(critical1); end; try if Assigned(FOnProgress) then Synchronize(Progress); Sleep(100); Application.ProcessMessages; except on e:Exception do //ShowMessage(e.message); end; [code] [解决办法] 什么原因,不清楚。但代码还是有点问题, if Assigned(FOnProgress) then Synchronize( Progress) ; 上面这段在EnterCriticalSection(critical1) 与 LeaveCriticalSection(critical1)之间,感觉很别扭,因为Synchronize也是同步。另外try..except不如换成try..finally。 而且加临界区是为了同步 totalsent吗?如果对于 totalsent只是子线程写,主线程读,那就不需要临界区。所以直接这样试试: totalsent:=totalsent+BytesSent; if Assigned(FOnProgress) then Synchronize( Progress) ;