Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.04;
Скачать: CL | DM;

Вниз

Создание потока   Найти похожие ветки 

 
Alternative   (2003-10-08 17:33) [0]

Привет!

Объясните мне что я делаю не так: Создаю Thread посредством команды

newThread = CreateThread(@newThreadAttrib,1024,@HandleRoutine,0,CREATE_SUSPENDED,@newThreadID);

и к этому потоку я могу обратиться только один раз

ResumeThread(newThread);

после очередного обращения действия не происходить


 
Suntechnic ©   (2003-10-08 17:36) [1]

Поясни термин "обратиться к потоку" и код потоковой ф-нции не мешало бы привести.


 
Mystic ©   (2003-10-08 17:44) [2]

1) Вместо CreateThread лучше использовать BeginThread
2) Больше кода...


 
Alternative   (2003-10-08 18:20) [3]

Сложно привести больше кода так как использовать этот метод дополнительных потоков я буду тогда когда пойму как это работает поэтому сейчас в теле процедуры написанно примерно следующее (истинный код на C++)


Form1.Canvas.LineTo(random(100),random(100));


to Suntechnic:
под "обратиться к потоку" ичел ввиду вызвать функцию в данном случае HandleRoutine


 
Suntechnic ©   (2003-10-08 18:54) [4]

>Alternative
под "обратиться к потоку" ичел ввиду вызвать функцию в данном случае HandleRoutine


Тогда что тебя смущает? Ф-нции и будет вызвана в созданном потоке только один раз. Когда она будет выполнена поток прекратит своё существование и возрадить его можно только созданием нового. Но обычно так никто не делает (слишком накладно, если много операций). Обычно поток "присыпляют" с помошью wait-ф-ций и по наступлении какого-либо события пробуждают для выполнения задачи и затем опять в спячку.


 
Alternative   (2003-10-08 19:21) [5]

Спасибо.
А мог бы ты еще обяснить как загнать поток в спячку, а также как его позвать для выполнения задачи. А то WinAPI Programer"s Guide в этом видимо не помощник.


 
Suntechnic ©   (2003-10-08 19:48) [6]

Alternative (08.10.03 19:21)
А мог бы ты еще обяснить как загнать поток в спячку


Обычно это делают с помощью т.н. Wait-ций типа WaitForSingleObject. Эта конкретная ф-ция приостанавливает выполнение потока пока объект синхранизации не перейдёт в в signaled стостояние или пока не выйдет время ожидания(его кстати можно задать бесконечным). Объекты синхранизации тоже бывают разные. Может быть event (CreateEvent), может быть семафор (CreateSemaphore) и т.д. Установить signaled состояние можно путём вызова соотв. ф-ций (SetEvent например)...
Вообщем тема довольно обширная и в двух словах не объяснить. Сделай поиск по сайту (тема тут часто обсуждается), почитай книги (лучше всего Рихтера) и конечно же MSDN


 
Mystic ©   (2003-10-08 19:56) [7]

Все работает (см. ниже) проблемы в коде потока... 1) Нельзя создавать потоки вызовом CreateThread, разве только ты уверен, что они никаких образом не используют RTL, VCL, ... 2) Кроме того, обращаться к графическим методам VCL можно только через Synchronize...

function ThreadFunc(Arg: THandle): Integer;
begin
Sleep(1000);
PostMessage(Arg, WM_USER, 0, 0);
Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ThreadId: Cardinal;
begin
FThreadHandle := BeginThread(nil, 4096, @ThreadFunc, Pointer(Handle),
CREATE_SUSPENDED, ThreadID);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ResumeThread(FThreadHandle);
end;

procedure TForm1.WMUser(var Message: TMessage);
begin
ShowMessage("Test");
end;


 
Alternative   (2003-10-09 12:51) [8]

Всем спасибо



Страницы: 1 вся ветка

Текущий архив: 2003.12.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
6-11654
ilka
2003-10-01 15:01
2003.12.04
TIdHttpServer TIdHttp TIdTCPClient TIdTCPServer


3-11594
Bart
2003-11-15 19:21
2003.12.04
GUID в MYSQL


6-11687
snake
2003-10-04 22:44
2003.12.04
Передача данных между TClientSocket и TServerSocket


9-11578
8bit
2003-05-19 15:29
2003.12.04
Солкновения


8-11633
AnthreX
2003-07-01 02:02
2003.12.04
TMediaPlayer