Главная страница
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.009 c
6-11675
mRodion
2003-10-06 18:47
2003.12.04
Еще раз про Indy idTCPClient


4-11729
FireHack
2003-10-08 12:35
2003.12.04
Командная строка процесса


6-11677
TButton
2003-10-05 01:18
2003.12.04
Socket. Восстановление связи.


8-11636
Sergo1
2003-08-05 15:56
2003.12.04
Рисование на рисунке.


6-11661
veresk
2003-10-11 01:17
2003.12.04
не работает logonuser