怎样让一个线程返回一个tstringlist类型的变量,或者说怎样在一个线程中使用另一个线程中的变量。
解决方案 »
- ++++++在运行态修改控件名称的问题++++++++++
- 如果我知道某个控件的Handle值,怎么通过程序得到该控件的实例?
- 调用dll
- 函数IN问题,急!
- 在局域中如何用代码来控制客户端连接后台数据库SQL!(98启动时不用输入用户名和密码来登录服务器)
- 这样的查询语句怎么写??
- 请教高手:数据库表操作
- 用SQL如何动态取的记录的前几行
- 编译时没出错,但运行时出现错误对话框(具体详见内容).而且更奇怪的是,原先是可以运行的,后来突然不行了!真搞不懂
- 如何在程序运行期动态设置控件焦点顺序?急!!!
- 谁有dxdbgrid,好像叫DevExQuantumGrid控件下载
- 有什么办法在字符位数不够的情况下自动补位,比如我需要位数位8个字节,但是现在有字符串‘我们’,不够8位,我想它自动补位
这是多线程同步的方法之一。 unit Main;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TMainForm = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
procedure ThreadsDone(Sender: TObject);
end; TFooThread = class(TThread)
protected
procedure Execute; override;
end;var
MainForm: TMainForm;implementation{$R *.DFM}const
MaxSize = 128;var
NextNumber: Integer = 0;
DoneFlags: Integer = 0;
GlobalArray: array[1..MaxSize] of Integer;
CS: TRTLCriticalSection;function GetNextNumber: Integer;
begin
Result := NextNumber;
inc(NextNumber);
end;procedure TFooThread.Execute;
var
i: Integer;
begin
OnTerminate := MainForm.ThreadsDone;
EnterCriticalSection(CS); //进入临界区
for i := 1 to MaxSize do
begin
GlobalArray[i] := GetNextNumber; //在这里操作公用变量就没问题。
Sleep(5);
end;
LeaveCriticalSection(CS); //离开临界区
end;procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: Integer;
begin
inc(DoneFlags);
if DoneFlags = 2 then
begin
for i := 1 to MaxSize do
Listbox1.Items.Add(IntToStr(GlobalArray[i]));
DeleteCriticalSection(CS);
end;
end;procedure TMainForm.Button1Click(Sender: TObject);
begin
InitializeCriticalSection(CS);
TFooThread.Create(False);
TFooThread.Create(False);
end;end.