Форум: "Основная";
Текущий архив: 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.046 c