Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.14;
Скачать: CL | DM;

Вниз

Надеюсь, что 2 тривиальных вопроса по потокам...   Найти похожие ветки 

 
reer   (2003-07-01 14:43) [0]

1. Создаю поток по нажатию кнопки:
Thd:=TLblTimer.Create(True);
Thd.Priority:=tpIdle;
Thd.Resume;

На другую кнопку вешаю его завершение
Thd.Terminate;
Thd.Free;

В потоке код:
While ... do
Begin
...
if terminated then Exit;
End;
После того, как я нажимаю на кнопку остановки возникает ошибка: "Thread Error: Параметр задан неверно (87)"
Трассировка показывает, что ошибка возникает при вызове Thd.Free;
Еще деталь: если я создаю поток Thd:=TLblTimer.Create(False), то ошибки уже не возникает.
Пожалуйста объясните мне почему так происходит и как бороться?

2. Ещё, как узнать создан уже поток или нет когда нужно его приостановить, ведь если он не создан опять будет ошибка, на if Thd=nil это проходит только когда он ещё не был создан не разу, но как быть, если поток уже создавался и уничтожался несколько раз?

3. Как мне передавать параметры в поток. Допустим у меня идет процедура сохранения в отдельном потоке, и мне соответственно нужно имя файла, ну и допустим ещё пара параметров. Хотелось бы видеть это в виде SaveFile(Name, qw,ger:String); Это возможно?


 
Serginio   (2003-07-01 14:48) [1]

Поставь Thd.FreeOnTerminate:=True и не вызывай Thd.Free;
Это будет правильно.


 
Семен Сорокин ©   (2003-07-01 14:50) [2]

1. У тебя случаем FreeOnTerminate не true?
2. при уничтожении присваивай ему nil
3. перекрой конструктор


 
Polevi ©   (2003-07-01 14:59) [3]

На другую кнопку вешаю его завершение
Thd.Terminate;
Thd.WaitFor;
Thd.Free;


 
reer   (2003-07-01 16:20) [4]

Всем большое спасибо, все работает, только в случае с WaitFor наблюдается небольшое зависание, видимо связанное с ожиданием нормального окончания потока.

>Семен Сорокин © (01.07.03 14:50) по поводу перекрытия конструктора, пожалуйста можно по-подробнее. Т.е. мне не хочется каждый раз писать
Thd:=TLblTimer.Create(True);
Thd.Priority:=tpIdle;
Thd.Resume;

и как реализовать отработку потока как обычной процедуры.

И ещё у меня вопросик. Если я хочу, чтобы поток делал, допустим сохранение и открытие, я могу написать эти процедуры (2 разных) в одном модуле потока или придется создавать 2 разных модуля?
В общем можно ли сделать что-то типа Execute2 в одном потоке?


 
Семен Сорокин ©   (2003-07-01 16:27) [5]

что-нить типа этого:
type
TBaseThread = class(TThread)
protected
FDatabase : TDatabase;
FDate : TDate;
FSession : TSession;
FTypeThread: TTypeThread;
procedure _Refresh;
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean; ATypeThread: TTypeThread; ADate: TDate);
destructor Destroy; override;
end;


В общем можно ли сделать что-то типа Execute2 в одном потоке?
зачем непосредственно в своем Execute определяй тип потока, который передавай в конструкторе, например (см. выше) и запускай нужный цикл


 
reer   (2003-07-01 16:30) [6]

>Семен Сорокин © (01.07.03 16:27)
СУПЕР! Огромный Вам пасиб!
Только все равно интересно, если я объявлю в public потока процедуру, то она будет работать относительно остальной программы как отдельный поток или нет?


 
reer   (2003-07-01 16:35) [7]

а, да, а старый Create вызывать уже не нужно? и почему Destroy перекрыт?
Unsatisfied forward or external declaration он говорит, когда я его перекрыл...


 
Семен Сорокин ©   (2003-07-01 16:35) [8]

Только все равно интересно, если я объявлю в public потока процедуру, то она будет работать относительно остальной программы как отдельный поток или нет?
нет, вызывай ее из перекрытого Execute


 
reer   (2003-07-01 16:40) [9]

А почему не работает-то? Ругается (см. выше)


 
reer   (2003-07-01 16:45) [10]

а мне потом не надо писать примерно этого?

constructor Create(CreateSuspended: Boolean; Max:String);
Begin
inherited Create(CreateSuspended);
End;


 
Serginio   (2003-07-01 16:50) [11]

Обязательно вызывать Inherrited конструкторов и деструкторов предков (иногда в другой последовательности чем предлагает Delphi). Разумеется если ты не реализуешь свой полностью функциональный конструктор и можешь обойтись без старого, но это бывает очень редко.


 
reer   (2003-07-01 16:54) [12]

>Serginio (01.07.03 16:50)
А деструктор можно оставить старый, так?


 
Serginio   (2003-07-01 17:06) [13]

Деструктор тебе нужно перекрывать только в случае освобождения выделенных ресурсов. Если же ты его перекрываешь то
Destructor TLblTimer.Destroy;
Begin

Твой код
inherited ;
// Иногда нужно менять послеловательность вызова деструктора предка
End;


 
Семен Сорокин ©   (2003-07-01 17:17) [14]

2reer
я же сказал "что-нить типа этого" это же не значит что нужно обязательно и деструктор к себе копировать :))
если обратишь внимание, то у меня кроме Execute есть еще и объекты, которые я создаю динамически, и которые нужно "убить" :)
для твоего случая достаточно конструктора см. Serginio


 
reer   (2003-07-02 12:09) [15]

Всем большое спасибо... Думаю, что ветка закрыта :)



Страницы: 1 вся ветка

Текущий архив: 2003.07.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
7-44925
РАуль
2003-04-29 09:20
2003.07.14
Windows Messages


1-44692
XobBIT
2003-06-30 17:19
2003.07.14
Как из библиотеки узнать путь до библиотеки?


3-44562
ADOQuery
2003-06-20 07:35
2003.07.14
При ADOQuery.Open появл. ошибка:


9-44534
Кен
2003-01-27 07:53
2003.07.14
GlScene Нет ли где нибудь описания для Material ? Уж больно много


1-44642
Tornado
2003-07-02 11:07
2003.07.14
работа с DLL, подскажите