关于产生线程!(api)(100分)

  • 主题发起人 主题发起人 whaoye
  • 开始时间 开始时间
W

whaoye

Unregistered / Unconfirmed
GUEST, unregistred user!
大家看一看,
如果我生成几个线程同时做同一个事情,
例如:
procedure threadfun;stdcall;
begin
//code here
end;

procedure button1click(sender:tobject);
var
i:integer;
thid:dword;
begin
for i:=1 to 10do
createthread(nil,0,@threadfun,nil,thid);
end;

象这个样子经常不能产生,为什么呢?
但是,如果我改为
for i:=1 to 10do
begin

createthread(nil,0,@threadfun,nil,thid);
sleep(100);
end;

就可以,为什么呢,
是不是一个线程还没有初始化就不能执行下面的for循环?
那怎么解决呢,
是不是要在线程函数里面加如等待函数,
 
哎呀 ,刚才写掉了一个参数,createthread(nil,0,@threadfun,nil,0,thid);
 
不会吧!?应该可以的。你的线程初始化时做了什么?threadfun里面干了什么?
 
跟threadfun有关系吗?
我就不知道是不是要等一个线程初试化后
才可以再生成下一个线程!
 
线程初始化不是你自己写的过程吗?线程在Create过程中已经完成自身的初始化。
>>是不是要等一个线程初试化后才可以再生成下一个线程!
我认为:不。
如果说“是”,就是线程的创建未完成,你得等它创建完。创建完后不需要再等待。
 
还有这样的问题吗?
关注。
 
但是,我总是感觉这个样子象不是很好,
能不能说一说,你们都怎么做?
还有比如说在threadfun我要访问一个全局的变量i,
并且是使他的值加一,一般可以直接用互锁函数很容易控制,
可是为什么如果我只是用i++也可以,
但是按照书上说的,应该有的时候可能会出错,
因为换成汇编的时候,
可能执行次序不同,
即使线程函数执行100次,可能结果都没有改变.
不过我用i++却一直都是正确的值,
为什么呢?
 
>>不过我用i++却一直都是正确的值
有些代码如I++执行速度快,出错机率非常低,可能要运行几十年才会
出一次错,但也可能刚一运行就出错。总之你不能保证不出错。
 
谢谢!接受答案
 
后退
顶部