constructor TTestThread.Create(CreateSuspended: Boolean;Edit: TEdit);
begin
FreeOnTerminate := true;
FEdit := Edit;
inherited Create(CreateSuspended); //inherited Create(False)会马上调用Execute
end;对Edit1操作时要进行同步控制.如用TThreadList.Add(Edit1) /Lock; /Unlock;
或:
procedure TTestThread.SetText;
begin
PostMessage(FEdit.Handle, WM_Char, 0, Integer(Pointer(PChar(IntToStr(FValue))));
//not SendMessage
end;
begin
FreeOnTerminate := true;
FEdit := Edit;
inherited Create(CreateSuspended); //inherited Create(False)会马上调用Execute
end;对Edit1操作时要进行同步控制.如用TThreadList.Add(Edit1) /Lock; /Unlock;
或:
procedure TTestThread.SetText;
begin
PostMessage(FEdit.Handle, WM_Char, 0, Integer(Pointer(PChar(IntToStr(FValue))));
//not SendMessage
end;
解决方案 »
- 自行开发的 DDMPF 企业管理动态框架,欢迎大家试用评估.
- 问个问题
- 关于指定文件的移动,相当于dos下的move 功能,在delphi中有类似的函数吗?
- 使用Hook禁止用户使用某些应用程序
- APDComPort求助!!!
- 急,请问如何打印DBGRID中的内容?
- 请教高手:del键如何判断
- 文件夹拷贝问题
- 急!高分求救!delphi中如何调api控制"音量控制"中麦克风的静音的选择框.对麦克风静音控制.
- 如何用实现Ado多线程?
- 登录窗口的问题,急!!!
- 我把一个值赋给access库中某个数据库的字段a,使用的是table组件,如:table1a.value:='aaa';但是,在数据库中并没有这个数据,WHY?AND HOW TO DO?
具体我说不清,对不是在线程生成的对象,而是引用的对象,要考虑它的线程安全,用(TThreadList, TSimpleEvent,etc)
老兄能否简单介绍一下TThreadList的用法。
TTestThread = class(TThread)
private
{ Private declarations }
FEdit : TEdit;
FValue : Integer;
procedure Lock;
procedure UnLock;
protected
procedure Execute; override;
procedure SetText;
public
constructor Create(CreateSuspended: Boolean;Edit: TEdit);
end;implementation{ TTestThread }procedure TTestThread.Execute;
var
i : Integer;
begin
{ Place thread code here }
i := 0;
while true do
begin
i := i + 1;
FValue := i;
Synchronize(SetText);
end;
end;constructor TTestThread.Create(CreateSuspended: Boolean;Edit: TEdit);
begin
FreeOnTerminate := true;
FEdit := Edit;
FLock := TThreadList.Create;
FLock.Add(FEdit);
inherited Create(CreateSuspended);
end;
procedure TTestThread.Lock;
begin
FLock.Lock;
end;procedure TTestThread.UnLock;
begin
FLock.Unlock;
end;
procedure TTestThread.SetText;
begin
Lock;
try
FEdit.Text := IntToStr(FValue);
finally
Unlock;
end;
end;end.我在网吧上的网,无法调试,大概是这样.
如果不用FLock: TThreadList,只改这个:procedure TTestThread.SetText;
begin
PostMessage(FEdit.Handle, WM_Char, 0, Integer(Pointer(PChar(IntToStr(FValue))));
//not SendMessage
end;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
FLock: TThreadList;
procedure Lock;
procedure UnLock;
{ Private declarations }
public
{ Public declarations }
end;FLock := TThreadList.Create放在TForm.OnCreate中procedure TForm1.Lock;
...
procedure TForm1.UnLock;
...你不如在做一TFOrm1的方法
procedure TFOrm1.Change(Value: Integer);
begin
Lock;
try
Edit1.Text := inttoStr(Value);
finally
Unlock;
end;
end然后由线程来调用Form1.Change(FValue);
procedure TTestThread.Execute;
var
i : Integer;
begin
{ Place thread code here }
i := 0;
while true do
begin
i := i + 1;
FValue := i;
Form1.Change(FValue);
end;
end;
TThreadList没有Lock和Unlock这两个函数,我改成LockList和UnlockList后,结果还是一样,
如果有时间,帮忙再看看,不过你在网吧,非常感谢了。