为什么我的多线程会一个一个的执行,而不是同时执行?(0分)

  • 主题发起人 主题发起人 jxzqsun
  • 开始时间 开始时间
J

jxzqsun

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序是这样的。
Tokok = Class(TThread)
private
FconnID:Integer;
procedure Mytest;
protected
procedure Execute;override;
public
constructor Create(var connID:Integer);virtual;
end;

constructor Tokok.Create(var connID:Integer);
begin
try
inherited Create(True);
FconnID:=connID;
FreeOnTerminate := True;
Resume;
Sleep(10);
except
Exit;
end;
end;

procedure Tokok.Execute;
begin
Synchronize(Mytest);
end;

procedure Tokok.Mytest;
begin
……(有一个循环)
end;

再然后就是
button1.click
for i:=1 to strtoint(edit1.text)do
begin
connID:=i;
Tokok.Create(connID);
end;

其实我的目的很简单,循环创建edit1里面数量的线程,每个线程执行一个循环,就这么简单,可为什么我的程序是一个线程一个线程的运行?
 
你的循环里是干什么的?是不是同步了全局变量?
线程在微观上也是串行执行的.
 
但我需要模拟同步执行啊,这样用户最起码觉得每个线程都在干活啊。
我不知道我的循环里要怎么写就会同步了全局变量。
 
同步的时候,就锁定了你的资源,只有当你的前个线程执行完时,才会释放,才能给下个线程使用.
所以就是你看到的"一个个执行".你把那个同步符去掉试试
 
好象有点用,但不知道是我程序还是什么问题,运行结果不太正常。我再看看。
为什么去掉那个同步符号就这样呢?
是什么道理呢??呵呵。。
 
Tokok.Create(connID);
是否需要改成
先定义一个数组,然后再 用数组的方式创建类?
 
哎,实在是我没分了,否则我不知道怎么感谢你了。。呵呵。。
但为什么去掉那个同步符号就可以呢?
 
我上面不是已经说了么,你再看清楚.
 
对了,我 Tokok.Create(connID);
没改,怎么也好象正常啊。
这两种有什么区别吗?
 
有多少个线程,就要创建多少个线程实例,
你的程序中好象只创建了一个实例。
 
但是我的线程数量是不确定的,我也知道我只有一个实例,epic有什么好办法不?
 
我动态创建线程,所以有多少个线程我也不知道,所以我实例不好多创建,而且如果线程数比较多的话,那我手工创建线程也太多了吧?
 
用了同步方法(Synchronize)还在说不知道,老兄真有你的!
 
HORNEY大师,我不懂,那些都是抄delphi 的DEMO啊,你能回答我的问题吗?
 
Synchronize ()是同步线程的一种方法
 
外循环不确定,也就实现了创建线程数目的不确定;(但不要太多)Synchronize有锁定的功能
但是不加他,你的变量,值,地址等就会出现问题,
不知我说的对不对;
 
抽奖程序?
 
这个问题的症结是 Synchronize 用错了地方。
正确的用法是
procedure Tokok.Mytest;
begin
……(有一个循环)
while xxdo
begin
Synchronize( ...)
end;
end;

该程序在Execute过程中用Synchronize,该线程必须结束后其它线程才能开始。
 
同意楼上的说法!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部