Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
1-44685
Vint45
2003-06-30 10:45
2003.07.14
Защита программы (+Oracle)


14-44899
Shaman
2003-06-27 16:45
2003.07.14
Фильм


14-44840
Юрий Федоров
2003-06-26 17:23
2003.07.14
Перлы горе-переводчика англ. фильмов


3-44609
TGrey
2003-06-21 13:27
2003.07.14
Распространение приложения


14-44844
Guest_Dmitry
2003-06-24 18:58
2003.07.14
Help по IbSqlMonitor





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