Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-11718
Полина
2003-10-08 15:11
2003.12.04
Поиск запущенного приложения


8-11629
Misha
2003-08-03 17:50
2003.12.04
форматы


8-11632
LevAlexander
2003-08-04 11:28
2003.12.04
MediaPlayer


1-11606
Seldon
2003-11-25 17:19
2003.12.04
TCheckListBox и lbVirtual


4-11753
Евгешка
2003-10-10 20:16
2003.12.04
ListView_GetItemPosition рабочего стола





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский