多线程在excute 中synchronize调用别的函数(非过程)通用方法? ( 积分: 20 )

  • 主题发起人 主题发起人 weismart
  • 开始时间 开始时间
W

weismart

Unregistered / Unconfirmed
GUEST, unregistred user!
求多线程的excute过程中调用别的函数(非过程)的通用方法,注明:函数要用到vlc
synchronize(Function)是不行的。
 
求多线程的excute过程中调用别的函数(非过程)的通用方法,注明:函数要用到vlc
synchronize(Function)是不行的。
 
什么意思说清楚点
 
...........
vcl还是vlc?
...........
 
不要用synchronize 用api来同步
有一套临界段的api
步骤:
声明变量 cs:_RTL_CRITICAL_SECTION;
初始化临界段 InitializeCriticalSection(cs);
进入临界段 EnterCriticalSection(cs);
离开临界段 LeaveCriticalSection(cs);
释放临界段 DeleteCriticalSection(cs);
 
给你个例子,刚用api写的 用vcl thread写是一样的,把进入 和 离开临界段加到excute里去
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
hThread:THANDLE ;
end;

function th_fn(p:pointer):DWORD;stdcall;
var
Form1: TForm1;
cs:_RTL_CRITICAL_SECTION;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
dw:DWORD;
begin
InitializeCriticalSection(cs);
hThread := CreateThread( 0,
0,
@th_fn,
0,
0,
dw)
end;

procedure TForm1.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
TerminateThread(hThread,0);
DeleteCriticalSection(cs);
end;

function th_fn(p: pointer): DWORD;
begin
while truedo
begin
EnterCriticalSection(cs);
//加入你需要运行的函数
//或者是其他需要同步的东西
Form1.Label1.Caption := datetimetostr(now());
LeaveCriticalSection(cs);
sleep(10);
end;
end;

end
 
synchronize方法是把你要执行的方法,排在主线程中。
 
后退
顶部