高手请入,有关线程的问题 在主线程中,定义一个threadtmp: TTreadXXX全局线程对象;创建一个线程时,把主线程中的一个VCL控件的句柄传入线程中,在线程中给VCL控件写数据,这里是否要加Synchronize进行同步,如果加了这个同步,就会出现主线程一直等待,这样线程就起不到作用。请问如何解决线程对主线程中的一个VCL控件写数据时,主线程又能正常运行? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 vcl控件都不支持多线程,所以你在线程里面调用vcl,需要同步一下。 是要加Synchronize系统一直等待?不会吧?代码贴出来看看 你还可以用在线程之间使用消息同步以替代TThread.Synchronize()方法。可以用SendMessage()或PostMessage()来发送消息 这是一个简单的代码,你看看Unit Unit1;InterfaceUses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;Type TForm1 = Class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } End; TTestThread = Class(TThread) private count: integer; public Procedure getcount; Procedure execute; override; End;Var Form1 : TForm1;Implementation{$R *.dfm}{ TTestThread }Procedure TTestThread.execute;Var i : integer;Begin Inherited; FreeOnTerminate:=true; For i := 1 To 10000000 Do Begin if Terminated then break; inc(count); Synchronize(getcount); End;End;Procedure TTestThread.getcount;Begin form1.edit1.Text := inttostr(count);End;procedure TForm1.Button1Click(Sender: TObject);var mythread:TTestThread;begin mythread:=TTestThread.Create(false);end;End. 要Synchronize,一定要同步。你也可以用消息:就是在线程在把结束算好(处理好),然后用消息发给Component~~~~~~~~~~~~ 帮我看看这个查找文件的函数如何修改? 如何利用类来封装 主从表 的数据库操作???? 已知道一个控件的句柄,如何获得该控件在屏幕中的绝对位置? 怎样实现Button上点击产生对话框 熟悉外挂字幕插件VobSub的大牛请进(高分相送) 今年考研失败了,想出去打工,心里有点慌,各位可以给点建议吗? 一个StorProc控件如果返回多个结果集,该如何处理? Canvas问题,急!! 春节恭贺贴(二)。。。。。。。。。。。 关于ini的创建与打开 Dll怎么调用. treeview中如何给当前选中的节点增加一个子结点?
不会吧?代码贴出来看看
可以用SendMessage()或PostMessage()来发送消息
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;Type
TForm1 = Class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
End;
TTestThread = Class(TThread)
private
count: integer;
public
Procedure getcount;
Procedure execute; override;
End;
Var
Form1 : TForm1;Implementation{$R *.dfm}{ TTestThread }Procedure TTestThread.execute;
Var
i : integer;
Begin
Inherited;
FreeOnTerminate:=true;
For i := 1 To 10000000 Do
Begin
if Terminated then break;
inc(count);
Synchronize(getcount);
End;
End;Procedure TTestThread.getcount;
Begin
form1.edit1.Text := inttostr(count);
End;procedure TForm1.Button1Click(Sender: TObject);
var mythread:TTestThread;
begin
mythread:=TTestThread.Create(false);
end;End.