| Автор
| Сообщение |
|
|
|
Цитата |
|
| Есть функция - вызывается по таймеру. Если она выполняется - при ее повторном вызове первую копию надо завершить. Как это сделать? |
|
| В начало |
|
 |
|
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
var
isActive:boolean=TRUE;
...........
if isActive then.......
else
Exit; |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Дополнение: функция, второй раз, вызывается совершенно от другого таймера. Таким образом контролировать....if не получится...
Я подозреваю надо как-то вызывать системные функции и проверять есть ли наша функция в памати и работает... так вот таких функций я не знаю |
|
| В начало |
|
 |
 NikotiN
Розовый мамонт

Возраст: 26
Знак зодиака: 
Зарегистрирован: 18.03.2005
Сообщения: 2137
|
|
|
Цитата |
|
| я тебя вообще не понял. но используй атомы. :) |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
| Цитата: | | Я подозреваю надо как-то вызывать системные функции и проверять есть ли наша функция в памати и работает... так вот таких функций я не знаю |
Если ты пишешь многопоточное приложение (TThread и т.д.), то синхронизировать надо с помощью критических секций или семафоров. Если у тебя просто два TTimer'а на форме, то можешь не напрягаться - в однопоточном приложении вторая функция ни за какие коврижки не вызовется, пока не отработает первая _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Задача: приложение однопоточное... сделать его многопоточным нереально(большой проект+мало времени)
Смысл моего вопроса учитывая ранее сказанное:
1. вызвать функцию А
2. если А работает убить А и запустить А ещё раз
функция А висит на двух таймерах
время выполнение функции А около 5-10 сек в это время может сработать таймер который спал...вот тогда нужно убить функцию А и запустить её заново
вроде усё... Кто чаго посоветует? |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
может сделать так, а?
| Код: |
var
ThreadId: cardinal;
procedure A;
var
dummy: Cardinal;
begin
if ThreadId=0 then
// создаем новый поток, в котором будут выполняться необходимые действия
ThreadId:=CreateThread(nil, 0, @B, nil, 0, dummy)
else
begin
TerminateThread(ThreadId, 0);
ThreadId:=0;
end
end;
function B(Param: pointer): DWord; stdcall;
begin
// какие-то действия, которые должны были выполняться в процедуре А
end;
initialization
ThreadId:=0;
|
|
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
| Цитата: | Задача: приложение однопоточное... сделать его многопоточным нереально(большой проект+мало времени)
Смысл моего вопроса учитывая ранее сказанное:
1. вызвать функцию А
2. если А работает убить А и запустить А ещё раз
функция А висит на двух таймерах
время выполнение функции А около 5-10 сек в это время может сработать таймер который спал...вот тогда нужно убить функцию А и запустить её заново
вроде усё... Кто чаго посоветует? |
Объясняю на пальцах: в однопоточном приложении второй таймер не может сработать, если в это время выполняется функция А. Вернее, сработать-то он сработает, но операционка просто бросит сообщение WM_TIMER в очередь приложения. И оно будет там болтаться ровно до тех пор, пока функция А не отработает. И лишь после этого оно обработается, и только тогда будет снова вызвана функция А.
Ну а если нет возможности переделать приложение в многопоточное, можно посоветовать только отказаться от идеи грохнуть функцию во время ее работы. Хотя добавить многопоточность в несложную программу - дело десяти минут, см. пост Ktf _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Спасибо за ответы!
Скорее всего придется оставить всё как есть....
Переход на много поточность..??? нет! Большой проект в реальном времени...(графика,сетка....) |
|
| В начало |
|
 |
|
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
| Цитата: | | Переход на много поточность..??? нет! Большой проект в реальном времени...(графика,сетка....) |
неубедительно!
почему такая боязнь многопоточности? |
|
| В начало |
|
 |
|
|
|
Цитата |
|
1.мало времени
2.то что нужно сделать это куочек большого проекта(изменение повлечёт за собой глобальные перемены...т.е. выпуск новой версии-> см. п1) |
|
| В начало |
|
 |
|