Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

timer в треде вешается, объясните чайнику [D6, Win2k]


msgipss ©   (2005-01-05 19:23:00) 

Поздравляю с новым годом. Хочу сделать следующее:
в потоке запустить таймер, чтобы он с опр. периодичностью делал опр.действие.
пишу код:
 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-06 11:53:00) [1]

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


KSergey   (2005-01-06 11:28:00) [2]

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

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


msgipss   (2005-01-06 11:06:00) [3]

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


KSergey   (2005-01-06 08:28:00) [4]

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


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

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


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

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


sniknik   (2005-01-05 20:13:00) [7]

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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо