Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизКак узнвать handle потока? Найти похожие ветки
← →
Destroyer © (2007-02-01 15:32) [0]Создаю свой поток (через меню фаил - там создать новый Thread Object, назвал, например, MyThread). Появляется новый юнит...
Чтобы, подождать выполнение потока нужен его хэндл:WaitForSingleObject(MyThread.Handle, INFINITE)
Но MyThread.Handle выдает ошибку при компиляции Method identifier expected.
В справке написано, что у TThread есть свойство handle, как до него добраться?
← →
Kolan © (2007-02-01 15:35) [1]> Чтобы, подождать выполнение потока нужен его хэндл:
Еще один :). Нафиг его ждать вообще?
Если надо чтобы сначало одно сделалось, потом другое то поток(доп.) вообще не нужен.
Пусть поток сам скажет(событие) что уже доделал все...
← →
Destroyer © (2007-02-01 16:38) [2]
> Пусть поток сам скажет(событие) что уже доделал все...
Так и делаю, но вылезает ошибка и чтении недоступной памяти и т.д.
Делаю:
...
public
destructor Destroy; override;
end;
...
destructor TimerThread.Destroy;
begin
inherited;
...
PromtRestart;
end;
PromtRestart
var RestDialog:integer;
begin // выдает диалог на запрос о перезагрузке
RestDialog:=MessageDlg(" Would you like to reboot now?",mtWarning,mbOKCancel,1);
if RestDialog = 1 then
begin
// TimerThread.handle;
// WaitForSingleObject(ThrHnd , INFINITE);
Reboot;
// затем надо выйти из програмы, чтобы пошла перезагрузка
halt;
end;
end; // procedure PromtRestart;
Reboot; - получает привилегию на зауск АПИ функции рестарта и запускает ее, чтобы пошел рестарт нужно завершить мое приложение, иначе он не идет.
Вот и реши просто подождать его завершение, т.к. похоже что на TimerThread.Destroy поток еще активен и вызов завершения вызывает кучу ошибок.
← →
Сергей М. © (2007-02-01 16:42) [3]Боже, какой бред ...
← →
Elen © (2007-02-01 16:53) [4]
> Чтобы, подождать выполнение потока нужен его хэндл:
А что OnTerminate не катит?
← →
DVM © (2007-02-01 16:55) [5]скорее уж WaitFor; Только выше написан такой бред, что это все равно не поможет.
← →
Destroyer © (2007-02-01 17:01) [6]Бред, бред, а подсказать можно?
OnTerminate, как его использовать?
procedure MyThread.OnTerminate; - не проходит.
← →
Kolan © (2007-02-01 17:06) [7]> Бред, бред, а подсказать можно?
Что надо сделать объясни...
← →
DVM © (2007-02-01 17:35) [8]
> Бред, бред, а подсказать можно?
destructor TimerThread.Destroy;
begin
inherited;
...
PromtRestart;
end;
Тебе выделенные жирным места ни о чем не говорят? Что-то не так вероятно?
← →
Destroyer © (2007-02-01 23:54) [9]
> Что надо сделать объясни...
Нужно: поток выполняет работу, выполнив ее, надо спросить нужна ли перезагрузка, если нужна (юзер ответил в диалоге - Да), то завершить работу программы и перезагрузить комп.
А в выделенном тексте:
Возможно я не правильно тогда понимаю...
Читать так? На уничтожение потока выполнить все, что должно выполниться без оверрайда + то, что нужно мне... Может inherited; и PromtRestart; местами поменять?
← →
Strate © (2007-02-02 01:48) [10]//объявления
procedure OnThreadTerminate (Sender : TObject);
procedure Создаём поток
MyThread := TMyThread.Create(true);
MyThread.OnTerminate := OnThreadTerminate;
MyThread.FreeOnTeminate := True;
MyThread.Resume;
end;
..
procedure OnThreadTerminate (Sender : TObject);
begin
//Вот тут и спрашиваем юзверя, чё делать
end;
P.S. Возможно что процедура OnThreadTerminate должна быть методом класса.
← →
Strate © (2007-02-02 01:55) [11]P.P.S - не возможно, а должна.
← →
Destroyer © (2007-02-02 02:44) [12]
> процедура OnThreadTerminate должна быть методом класса.
А как ее сделать таковой? В данном виде -[10] ошибка - Method identifier expected.
← →
Strate © (2007-02-02 10:38) [13]Ну опиши поток в модуле формы, а процедуру OnThreadTerminate сделай методом формы например.(перенести в класс TForm1)
← →
Elen © (2007-02-02 10:53) [14]
> поток выполняет работу, выполнив ее, надо спросить нужна
> ли перезагрузка
Если не секрет - зачем обязательно потоками делать? Что за задача?
← →
Strate © (2007-02-02 11:01) [15]Elen © (02.02.07 10:53) [14]
Скорее всего ему нужно ещё прогресс-бар отображать :)
← →
Destroyer © (2007-02-02 13:27) [16]
> зачем обязательно потоками делать?
Для разморозки интерфейса. Application.ProccessMessages не предлагать.
Есть 3 Юнита, из них два с формами, один - поток (Unit2). Переносить объявление потока:
> опиши поток в модуле формы
Можно пример?
Пишу (Unit2):type
MyThread = class(TThread)
...
procedure OnThreadTerminate (Sender : TObject);
...
procedure OnThreadTerminate (Sender : TObject);
begin
//Вот тут и спрашиваем юзверя, чё делать
end;
MyThread.Create();
...
MyThread.OnTerminate := OnThreadTerminate;
...
Курсор ставится на OnTerminate и ошибка Method identifier expected.
Видимо, в Unit1 надо еще дописать что-то. Что и где?
Из справки:
Write an OnTerminate event handler to execute code after the thread finishes executing. The OnTerminate event handler is called in the context of the main thread, which means methods and properties can be called freely.
Значит это:procedure OnThreadTerminate (Sender : TObject);
begin
//Вот тут и спрашиваем юзверя, чё делать
end;
надо писать в первом юните?
← →
Strate © (2007-02-02 19:19) [17]В юните первом у тебя объявлена форма
TForm1 = class (TForm)
...
private
...
procedure OnTerminateThread ( Sender : TObject);
...
end;
//ниже приписываешь объявление потока:
TThread = class (TThread)
...
И пошло-поехало
← →
Strate © (2007-02-02 19:20) [18]А ну и писать надо будет соответственно
MyThread.OnTerminate := Form1.OnThreadTerminate;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c