Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
ВнизСоздание потока Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c