我是个菜鸟,想知道begin thread 和endthread的用法,急急急!!!(150分)

  • 主题发起人 主题发起人 晓诚
  • 开始时间 开始时间

晓诚

Unregistered / Unconfirmed
GUEST, unregistred user!
通常我都是这样用的
var
thid:dword;
begin
thread(nil,0,@myupdatefun,nil,0,thid);
其中myupdatefun是数据处理过程;
但是当在myupdatefun中发生非法错误的时候,整个程序就会自动退出,让你不知道在什么
地方出错,不知道为何,还是线程就是这样的。
1、thid是不是用来记录这个线程的占用空间大小的,
如果数据占用空间过大,是不是线程也会退出!
2、我想应该能用endthread来终止这个线程的,不知道怎样处理,
请高手指教
 
begin
Thread(SecurityAttributes: Pointer;
StackSize: LongWord;
ThreadFunc: TThreadFunc;
Parameter: Pointer;
CreationFlags: LongWord;
var ThreadId: LongWord): Integer;

SecurityAttributes: a pointer to a security record, used only in windows NT, fill in nil
StackSize: the initial stack size of the thread. The default value is 1MB. If you think this is too small fill in the desired size, otherwise if not fill in 0.
ThreadFunc: This is the function that will be executed while the thread is running. This is mostly a function with a while loop inside. The prototype is function(Parameter: Pointer): Integer
Parameter: This is a pointer to a parameter, which can be anything you like. It will be passed to the thread function as the parameter pointer.
CreationFlags: This flag determines whether the thread starts immediately or it is suspended until ResumeThread is called. Use CREATE_SUSPENDED for suspended and 0 for an immediate start.
ThreadID: This is a var parameter that will return the ThreadID of the thread.
 
jqw,小弟英语比较差,能不能告诉我怎么样用,因为,现在begin
thread我已经会用了,但是
我想是否它应该和endthread配合使用呢?而且还有上述的问题,我的程序总是出现这样的突然
关闭的现象,而且我还找不到原因,请指教,
savenight谢谢你的帮助,不过这个DELPHI帮助中也有,可能我的问题不太清楚
我想知道endthread与begin
thread的配合使用问题,和在begin
thread中出现的异常问题
 
我给的帮助你好好看了没有? 好像delphi里没有吧?[:D]
 
savenight,但是begin
thread我会用呀,现在我只想知道endthread与begin
thread
的配合使用问题,和在begin
thread中出现的异常该怎样处理,是不是程序会因为线程
终止而突然退出。
 
呵呵 ,好久没有看过E文了。现在试着翻译翻译。
begin
Thread(SecurityAttributes: Pointer;
StackSize: LongWord;
ThreadFunc: TThreadFunc;
Parameter: Pointer;
CreationFlags: LongWord;
var ThreadId: LongWord): Integer;

SecurityAttributes:一个指向安全记录的指针,仅仅被使用在NT里面,用NIL来填充。
StackSize:线程初始栈的大小。缺省值为1M。如果你认为这个缺省值太小,它会填充慢你设计的大小。
否则则用0来填充。
ThreadFunc: 这是那个当线程在运行时候被执行的函数。这是一个大部分情况下带有一个循环再里面的函数。
他的使用函数形式: function(parameter:Pointer);Integer;
Parameter: 这是一个指向可以是任何你喜欢的形式的参数的指针。它将被传递给线程函数作为参数指针。
CreationFlags:这个标志决定着是否这个线程立即开始或者它将被挂起直到ResumeThread被调用。
使用参数Create_Suspended去挂起这个线程,使用0立刻启动这个线程。
ThreadID:这个参数将传递回线程的ThreadID.
各位看官见笑了!
 
那么到底有没有人知道endthread的用法呀
 
要详细点请看SysUtils
EndThread( ExitCode: Integer );.
 
难道这么大个林子就没有人知道吗?
:YB_unique兄,希望你能告诉我实际的答案,而不是让我去找,要不然,你的回答没有
任何意义。
我现在只想知道,是不是在begin
thread中出现错误,如果不做处理的话,整个程序会自动退出
(因为我现在的程序就是这样的现象),还有是不是begin
thread要和endthread配合使用
该怎样使用。希望各位多多关照
 
给你个例子,实在不知道你有什么不明白的!
ThreadID : Integer;
StopThread : Boo8lean;
procedure Thread;
procedure TMyClass.Thread;
begin
while StopThread = Falsedo
begin
// 你的代码
end;
EndThread(0);
end;

procedure TMyClass.StartMyThread;
begin
if ThreadID = 0 then
begin
StopThread := False;
begin
Thread(nil, 0, StartThread, self, 0, ThreadId);
end;
end;

procedure TmyClass.StopMyThread;
begin
StopThread := True;
ThreadID := 0;
// 进程可能还在运行
end;

function StartThread(Obj : Pointer) : Integer;
//调用进程
begin
if TObject(Obj) is TMyClass then
begin
Result := 1;
TMyClass(Obj).Thread;
end
else
begin
Result := 0;
EndThread(-1);
end
end;
 
1、最后一个参数是返回的THREAD ID (不是什么空间)
2、ENDTHREAD是终止本线层并返回EXITCODE用的
3,线层出错的问题应该在myupdatefun里使用TRY来处理错误
此外,导致主程序退出还很有可能是因为你的MYUPDATEFUN里
使用了VCL对象,绝大多数的VCL对象都不是线层安全的,
如果要使用VCL对象,最好看看TTHREAD的写法,例如使用SENDMESSAGE的方式
和主线层同步,其实也就是实现TTHREAD的Synchronize方法.
否则,如果你对这些东西都把握不住,劝你不要去碰线层,VCL不是一个对线层支持很好
的东西.
 
:YB_unique兄,你的例子是在线程单元中实现begin
thread和ENDTHREAD,而我的
程序是在窗体中调用begin
thread的,不知道有没有什么关系
比如
procedure myupdatefun;
begin
//我的处理过程
end;
procedure button1click;
var
thid:dword;
begin
thread(nil,0,@myupdatefun,nil,0,thid);
end;
不知道这样的情况该怎样处理,不好意思,麻烦您了,必有重谢
也请各位大侠指教
 
干吗不直接使用CreateThread这个windows api呢。
顺便说一名C++就是方便一些。可以一将一个类的静态方法做为CreateThread的线程过程。
而Delphi即不行。
 
procedure EndThread(ExitCode: Integer);
的最后一个参数ExitCode,可以通过下面的函数来获得:
function GetExitCodeThread(
hThread: THandle;
//线程的句柄
var lpExitCode: DWORD): //获取终止码的变量
BOOL;
stdcall;
调用这个函数获得的lpExitCode代入EndThread用就行了。
 
可是EndThread是在什么时候用呀,在语句处理的什么地方呢?是出异常的时候
还是在正常结束的时候都用呢?还是其他呢?
,还有,是不是begin
thread必须要和endthread配合使用呢?
请高手再指教
 
Endthread在线程中使用, 而且最好是在线程的执行体内, 如果是用DELPHI的THREAD对象, 那
么你是不需要自己去用begin
THRED 和 ENDTHREAD的, 但如果你是自己写线程, 那你就应
在你的线程方法中用ENDTHREAD, 至于何时用, 那就由你自己决定了, 总之, 如果你想结
束线程, 你就要用ENDTHREAD, 不管是异常还是正常. 其实你如果要自己写线程, 不用
DELPHI的线程对象的话, 你不如直接使用CREATETHREAD, EXITTHREAD, SUSPENDTHREAD,
RESUMETHREAD, TERMINATETHREAD, SETTHREADPRIORITY ETC.去操纵线程, 这样也许会
更灵活一些, 要不就用TTHREAD对象, 而不用去理会ENDTHREAD, begin
THRED, 因为TTHRAD
会自己去处理.
 
:YB_Unique兄
你的代码里有个问题:如果procedure TMyClass.Thread;是个需要传参数的过程怎么办?
 
还有,是否begin
Thread不能把类的静态方法当成参数传进去?如果能,那这个
方法里面能否调用类的其他方法?(包括虚的)
 
后退
顶部