procedure TPlayer.LoopController(Self: TPlayer; prm: Pointer)
begin
// ...
end;
Проблема с потоками
Constructor TPlayer.Create;
Begin
...................
TheardData.TheardStoper := false;
THeardHandle := CreateTHread(nil,0,@TPlayer.LoopController,@TheardData,0,ThreadID);
End;
процедура самого потока:
Function TPlayer.LoopController(prm: Pointer) :Integer; //stdcall;
Var
pp : TTheardData;
Begin
pp := TTheardData(prm^);
while not pp.TheardStoper do
Begin
Sleep(10);
End;
End;
Проблема в том что когда я передаю запись(а точнее указатель на нее) в поток , а потом к ней обращаюсь(внутри потока), запись содержит совсем не то что должна, хотя данные нигде в коде после запуска потока не меняются, в приведенном куске кода поток почемуто сразу завершает работу, хотя должен работать бесконечно т.к. TheardData.TheardStoper = false;, а на самом деле это поле равно тру когда обращаешься к нему из потока, что делать? уже замучался (
Код:
Варианты решения:
1. Создать обычную процедуру (ИМХО, геморный вариант):
Код:
constructor TPlayer.Create
begin
//...
ThreadData.ThreadStoper:=false;
ThreadData.Player:=Self; // это поле необходимо добавить
ThreadHandle:=CreateThread(nil, 0, @ExtLoopController, @ThreadData, 0, ThreadID);
end;
procedure ExtLoopController(prm: Pointer); stdcall;
begin
TThreadData(prm^).Player.LoopController(prm);
end;
function TPlayer.LoopController(prm: Pointer) :Integer;
var pp : TTheardData;
begin
pp := TTheardData(prm^);
while not pp.TheardStoper do
begin
Sleep(10);
end;
end;
begin
//...
ThreadData.ThreadStoper:=false;
ThreadData.Player:=Self; // это поле необходимо добавить
ThreadHandle:=CreateThread(nil, 0, @ExtLoopController, @ThreadData, 0, ThreadID);
end;
procedure ExtLoopController(prm: Pointer); stdcall;
begin
TThreadData(prm^).Player.LoopController(prm);
end;
function TPlayer.LoopController(prm: Pointer) :Integer;
var pp : TTheardData;
begin
pp := TTheardData(prm^);
while not pp.TheardStoper do
begin
Sleep(10);
end;
end;
Код:
type
TPlayerWrapper = class (TThread)
private
player: TPlayer;
protected
procedure Execute; override;
public
constructor Create(p: TPlayer);
end;
constructor TPlayerWrapper.Create(p: TPlayer);
begin
player:=p;
end;
procedure TPlayerWrapper.Execute;
begin
while not Terminated do
player.LoopController;
end;
end;
TPlayerWrapper = class (TThread)
private
player: TPlayer;
protected
procedure Execute; override;
public
constructor Create(p: TPlayer);
end;
constructor TPlayerWrapper.Create(p: TPlayer);
begin
player:=p;
end;
procedure TPlayerWrapper.Execute;
begin
while not Terminated do
player.LoopController;
end;
end;
Код:
type
TPlayer = class (TThread)
// ...
protected
procedure Execute; // это и есть LoopController
// ...
end;
TPlayer = class (TThread)
// ...
protected
procedure Execute; // это и есть LoopController
// ...
end;
Удачи.
А в последнем случае как быть с запуском и созданием нового потока, у меня просто свои собственые Create и Destroy?