用一个线程去做一件事,和放心time事件里不断循环做有什么区别?如果不是在线程里使用sleep,那么在sleep的期间,主进程是不是全部停止呢?
解决方案 »
- sql语句
- 急,急,急,100分请大侠们看看这个Sql语句如何写!!!
- 请问如何在Delphi7中使用Delphi6中的TServerSocket和TClientSocket两个组件?
- DBGrid的简单问题,新年新气象,给个吉利分。
- Rave报表起步,如何把程序中的数据写入报表?
- 谁能给个简单的Tree使用的例子?
- stringgrid的问题
- 有关COM中接口集成的问题
- 紧急求救,我在Tpanel面板上放了很多东西,怎样把整个面板打印出来,对会的我不难,5分钟后给分。
- 那里有关于quickreport的详细书籍或者文章?我急着去救人去!
- 关于delphi BHO插件开发 的问题
- 非OLE方式写EXCEL
-------
用另一个线程去做一件事,本线程正在做的事不会被干扰;
用timer去做一件事,timer也是在本线程做的事,所以会互相干扰。比如本线程要等timer里的事做完之后,才会再继续做事。如果不是在线程里使用sleep,那么在sleep的期间,主进程是不是全部停止呢?
--------
对
sleep在本线程起作用(等待),那么不在线程中使用就是在主线程中使用sleep, 当然影响主线程了。
在主线程中使用sleep,将导致程序假死。
var
s:String;
m,I:integer;
begin
procedure TSaveDataThread.SelfExecute;
var
s:String;
m,I:integer;
begin
// while AFree=1 do
begin
while Bcommand do
begin
if ReadList.Count > 0 then //在线程里执行,这里的count的值会越来越多,而放在进程,基本上是0
begin
s:=ReadList[0];
if Length(s)>100 then
begin
for I := Low(FSaveDataByte) to High(FSaveDataByte) do
FSaveDataByte[i]:= 0;
for i := 1 to Length(s) div 2 do
begin
m:=i*2-1;
FSaveDataByte[i-1]:=StrToInt('$'+s[m]+s[m+1]);
end;
// CnDebugger.LogMsg( s );
Chan1ob.SaveVaTxt(8,FSaveDataByte);
Chan2Ob.SaveVaTxt(90,FSaveDataByte);
end;
readlist.Delete(0);
end;
Sleep(1);
Application.ProcessMessages; end;
end;
end;
里面也都会同时执行,不会等待一个执行完再执行,这种不叫阻塞进程吧。那如何理解阻塞进程呢?就是进程本身要执行的内容变慢了?
timer仍在主线程里。
主线程里sleep会停止主线程。