导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
blbz (冰力不足)
★☆☆☆☆
-
禁用账号
2017/6/19 9:06:39
标题:
加入我的收藏
楼主:
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
SPAM
作者:
2017/6/19 9:20:02
1楼:
线程中禁止访问 UI。 另外有 线程类,不需要你调用 API。 你调用了 API,出问题,找微软,不要让 DELPHI 背黑锅。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/6/19 9:26:01
1楼:
我一般都是这样做的 type {TReadProcess 负责从缓冲池读取数据} TReadThreadEvent = procedure(P: Pointer) of object; TReadProcess = class(TThread) private Fhandle: THandle; FDataBufferType: TDataBufferType; FSourceType: TSourceType; protected FOnExecute: TReadThreadEvent; procedure Execute; override; public constructor Create; overload; destructor Destroy; override; procedure ReadDataBuffer(P: Pointer); virtual; procedure SetReadDataBuffer(AValue: TReadThreadEvent); published property DataBufferType: TDataBufferType read FDataBufferType write FDataBufferType; property SourceType: TSourceType read FSourceType write FSourceType; property OnExecute: TReadThreadEvent read FOnExecute write FOnExecute; end; { TReadProcess } constructor TReadProcess.Create(); begin inherited Create(false); //FreeOnTerminate := true; end; destructor TReadProcess.Destroy; begin inherited Destroy(); end; procedure TReadProcess.Execute; var P: Pointer; begin inherited; while not Terminated do begin p := nil; ReadDataBuffer(P); Sleep(100); end; end; procedure TReadProcess.ReadDataBuffer(P: Pointer); begin if Assigned(FOnExecute) then FOnExecute(P); end; procedure TReadProcess.SetReadDataBuffer(AValue: TReadThreadEvent); begin if Assigned(AValue) then FOnExecute := AValue; end; ---------- var myReadProcess: TReadProcess; procedure TForm1.myprocess(P: Pointer); begin //代码A end; procedure TForm1.Button1Click(Sender: TObject); var P: Pointer; begin if myReadProcess= nil then myReadProcess:= TReadProcess.Create; myReadProcess.OnExecute := myprocess(p); end;
----------------------------------------------
-
作者:
blbz (冰力不足)
★☆☆☆☆
-
禁用账号
2017/6/19 9:56:17
2楼:
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
SPAM
作者:
2017/6/19 10:13:34
3楼:
我都用匿名的线程。现写线程内部代码。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/6/19 10:33:12
4楼:
老王用API ,还是线程类?
----------------------------------------------
-
作者:
2017/6/19 11:28:15
5楼:
什么叫跑偏?这个描述真销魂。。。 还有,windows虽然不禁止,但是你也不要在子线程里去直接控制ui。
----------------------------------------------
--
作者:
2017/6/19 11:32:01
6楼:
不管是API还是线程类, 都不得在线程内访问窗口句柄
----------------------------------------------
-
作者:
2017/6/19 12:35:30
7楼:
还是用 TTimer 吧, 如果不是非得用线程
----------------------------------------------
我84砖家
作者:
blbz (冰力不足)
★☆☆☆☆
-
禁用账号
2017/6/19 21:56:02
8楼:
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
SPAM
作者:
2017/6/20 8:01:39
9楼:
@blbz (冰力不足) 想要轻舞飞扬,请用QWorker 或者 OmniThreadLibrary, 和你使用api的效果相不多。 比如用 QWorker 可以 直接 procedure TXXXX.DoHeart(AJob: PQJob); begin if AJob.IsTerminated then Exit; //你的代码 end; Workers.Post(DoHeart,nil); //nil那货是用来传递参数到线程函数内部的,如果有的话。当然还有很多高级用法,定时,计划组,消息啥的,就得你自己研究了。
----------------------------------------------
-
作者:
blbz (冰力不足)
★☆☆☆☆
-
禁用账号
2017/6/20 9:49:17
10楼:
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
SPAM
作者:
2017/6/20 10:20:06
11楼:
最近几个项目都在用qworker,感觉真是个好东西!楼主可以试一下。
----------------------------------------------
-
作者:
blbz (冰力不足)
★☆☆☆☆
-
禁用账号
2017/6/20 17:29:09
12楼:
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
SPAM
作者:
blbz (冰力不足)
★☆☆☆☆
-
禁用账号
2017/6/20 18:36:16
14楼:
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
SPAM
作者:
2017/6/21 0:00:31
15楼:
@hardnut 没那么严重吧兄弟,多线程的东西玩儿多了你就习惯了。咱平时一个程序里二三十条线程都稀松平常的,线程上下文想想清楚就可以了,没啥好担心的。
----------------------------------------------
-
作者:
2017/6/21 0:19:02
16楼:
老老实实按照OS的要求,UI线程干它的事,辅助线程干它的事,分工明确,不是更好!
----------------------------------------------
-