Форум: "Основная";
Текущий архив: 2003.07.14;
Скачать: [xml.tar.bz2];
ВнизНадеюсь, что 2 тривиальных вопроса по потокам... Найти похожие ветки
← →
reer (2003-07-01 14:43) [0]1. Создаю поток по нажатию кнопки:
Thd:=TLblTimer.Create(True);
Thd.Priority:=tpIdle;
Thd.Resume;
На другую кнопку вешаю его завершение
Thd.Terminate;
Thd.Free;
В потоке код:
While ... do
После того, как я нажимаю на кнопку остановки возникает ошибка: "Thread Error: Параметр задан неверно (87)"
Begin
...
if terminated then Exit;
End;
Трассировка показывает, что ошибка возникает при вызове 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c