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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-1105612514
Walker
2005-01-13 13:35
2005.01.23
Quick Report for Delphi 2005


1-1105364591
snake_r
2005-01-10 16:43
2005.01.23
TImage


3-1103636653
Guitar
2004-12-21 16:44
2005.01.23
Вернуть параметры из хранимой процедуры.


14-1104509367
Константинов
2004-12-31 19:09
2005.01.23
Сеть своими руками.


14-1104623168
Германн
2005-01-02 02:46
2005.01.23
Новый Год - прекрасная пора!