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

Вниз

timer в треде вешается, объясните чайнику   Найти похожие ветки 

 
msgipss   (2005-01-05 19:23) [0]

Поздравляю с новым годом. Хочу сделать следующее:
в потоке запустить таймер, чтобы он с опр. периодичностью делал опр.действие.
пишу код:
 TSoftReport = class(TThread)
     private
        Timer: TTimer;  
        nCount:Word;
     protected
        procedure Execute; override;
        procedure ReadData;    
        procedure onTimerUpdate(Sender:TObject);
     public
      constructor Create(sFileName:String);  
  end;

constructor TSoftReport.Create(sFileName:String);  
begin
FreeOnTerminate := false;  
Timer:=TTimer.Create(nil);
Timer.OnTimer:=onTimerUpdate;
nCount:=0;
inherited Create(False);    
end;

procedure TSoftReport.Execute;
begin
Timer.Interval:=5000;
Timer.Enabled:=True;
end;

procedure TSoftReport.onTimerUpdate(Sender:TObject);
begin
  Timer.Enabled:=False;
   InC(nCount);
     Synchronize(ReadData);  
  Timer.Enabled:=True;
end;

procedure TSoftReport.ReadData;
begin
//  unit1.Form1.Label1.Caption:=intToStr(nCount);
end;

В результате он уходит на синхронизацию и все. если убираю       Synchronize(ReadData);   - то все работает
Объясните пожалуйста что происходит ?
Заранее спасибо за подсказку..


 
msgipss   (2005-01-05 19:40) [1]

И вообще можно ли смешивать tthread и ttimer ? 8(
Если нет, то как можно решить задачу, выполнение периодичных процессов в потоке ?


 
sniknik ©   (2005-01-05 20:13) [2]

> И вообще можно ли смешивать tthread и ttimer ? 8(
если сделаеш обработку событий в потоке, то можно.

> как можно решить задачу, выполнение периодичных процессов в потоке ?
sleep на время задержки. (а лучше не одним а в цикле с небольшим периодом и проверкой на "выход", иначе терминейт(нормальный) не пройдет придется дожидатся конца "слипа")


 
msgipss   (2005-01-05 20:27) [3]

>если сделаеш обработку событий в потоке, то можно.
да действительно так работает, а если мне нужно в обработчике события синхронизировать данные с др. потоком, то никак значит?
И временные периоды мне придется самому проверять, через gettime какой нить, получается ?


 
msgipss   (2005-01-05 20:38) [4]

Еще вопрос можно, я хочу синхронизировать данные с основного потока, данные представляют собой массив записей. Могу ли я при создании потока передать указатель на этот массив, и при синхронизации читать/записывать/добавлять/удалять данные из этого массива. Дело в том что клас потока описан в отдельном модуле, и мне бы не хотелось подключать др. модули в этом потоке, для использования переменных.
Заранее благодарен


 
KSergey ©   (2005-01-06 08:28) [5]

Как только для выполнения основного действия в потоке привлекается Synchronize - возникает серьезное сомнение в целесообразности применения потока (почему - читай как работает Synchronize).
Может Application.OnIddle вполне подойдет использовать?


 
msgipss   (2005-01-06 11:06) [6]

KSergey я понимаю, спасибо, Synchronize я использую только для обмена данными с др.потоками, основная работа делается в конструкциях самого потока. А ссылку передавать я хотел только для того, что бы не подключать др. модули. И все же как передать ссылку на массив ?
А, если я использую property и управляю через них работой потока - это считается нормальным ?


 
KSergey ©   (2005-01-06 11:28) [7]

> [6] msgipss   (06.01.05 11:06)
> А, если я использую property и управляю через них работой
> потока - это считается нормальным ?

Да.
Однако будет ли это работать - зависит от реализации.


 
msgipss   (2005-01-06 11:53) [8]

Работает...
А все таки как лцчше синхронизировать данные с внешней структурой ?
Извините повторюсь, есть модуль в котором реализован класс потока и там же тип структуры с которой будет происходить синхронизация, этот модуль будет подключаться к др. модулям и там использоваться, т.е. в основном потоке будет переменная типа структура, наш поток время от времени должен с ней синхронизироваться, но чтобы мне не менять код класса нашего потока (не вставлять uses mainthread например), я хочу при создании потока передать ему ссылку на структуру с которой он должен синхронизироваться. Так вопрос, можно ли так делать, и как ?



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

Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.043 c
4-1101985427
Ana
2004-12-02 14:03
2005.01.23
Как отловить нажатие кнопки в окне чужого приложения?


14-1104865112
Andrewp
2005-01-04 21:58
2005.01.23
Эксклюзив.


14-1104482693
vidiv
2004-12-31 11:44
2005.01.23
Я новый год встречу одним из первых :)


10-1081321930
com.dll
2004-04-07 11:12
2005.01.23
Отладка com-сервера


1-1104938461
WhiteGuy
2005-01-05 18:21
2005.01.23
Идентично, сэр?





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