Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.039 c
2-1170164743
Хеад
2007-01-30 16:45
2007.02.18
Помогите решить задачу на Turbo Pascal


2-1170163085
term1t
2007-01-30 16:18
2007.02.18
..=procedure (...,...) of object;


15-1169567372
TIF
2007-01-23 18:49
2007.02.18
Создание своего формата файла


2-1170173772
alfavit
2007-01-30 19:16
2007.02.18
Мистика какая то, заполняю одну запись а данные пишутся


2-1170158867
fisherman
2007-01-30 15:07
2007.02.18
Печать этикеток в Делфи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский