Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Повторный вызов функции


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
doca
Гость







СообщениеПт, 08-Июл-2005 10:58    Заголовок сообщения: Повторный вызов функции
Цитата

Есть функция - вызывается по таймеру. Если она выполняется - при ее повторном вызове первую копию надо завершить. Как это сделать?
В начало
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеПт, 08-Июл-2005 12:22 
Цитата

var
isActive:boolean=TRUE;

...........
if isActive then.......
else
Exit;
В начало
Посмотреть профиль Отправить личное сообщение
doca
Гость







СообщениеПт, 08-Июл-2005 13:12    Заголовок сообщения: Повторный вызов...
Цитата

Дополнение: функция, второй раз, вызывается совершенно от другого таймера. Таким образом контролировать....if не получится...
Я подозреваю надо как-то вызывать системные функции и проверять есть ли наша функция в памати и работает... так вот таких функций я не знаю
В начало
Пол:Муж NikotiN
Розовый мамонт


Возраст: 26
Знак зодиака: Овен
Зарегистрирован: 18.03.2005
Сообщения: 2137

СообщениеПт, 08-Июл-2005 19:31 
Цитата

я тебя вообще не понял. но используй атомы. :)
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеСб, 09-Июл-2005 11:18 
Цитата

Цитата:
Я подозреваю надо как-то вызывать системные функции и проверять есть ли наша функция в памати и работает... так вот таких функций я не знаю

Если ты пишешь многопоточное приложение (TThread и т.д.), то синхронизировать надо с помощью критических секций или семафоров. Если у тебя просто два TTimer'а на форме, то можешь не напрягаться - в однопоточном приложении вторая функция ни за какие коврижки не вызовется, пока не отработает первая

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
doca
Гость







СообщениеПн, 11-Июл-2005 8:29 
Цитата

Задача: приложение однопоточное... сделать его многопоточным нереально(большой проект+мало времени)
Смысл моего вопроса учитывая ранее сказанное:
1. вызвать функцию А
2. если А работает убить А и запустить А ещё раз
функция А висит на двух таймерах
время выполнение функции А около 5-10 сек в это время может сработать таймер который спал...вот тогда нужно убить функцию А и запустить её заново
вроде усё... Кто чаго посоветует?
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеПн, 11-Июл-2005 13:14 
Цитата

может сделать так, а? ;)

Код:

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
Откуда: Донецк
СообщениеПн, 11-Июл-2005 20:09 
Цитата

Цитата:
Задача: приложение однопоточное... сделать его многопоточным нереально(большой проект+мало времени)
Смысл моего вопроса учитывая ранее сказанное:
1. вызвать функцию А
2. если А работает убить А и запустить А ещё раз
функция А висит на двух таймерах
время выполнение функции А около 5-10 сек в это время может сработать таймер который спал...вот тогда нужно убить функцию А и запустить её заново
вроде усё... Кто чаго посоветует?

Объясняю на пальцах: в однопоточном приложении второй таймер не может сработать, если в это время выполняется функция А. Вернее, сработать-то он сработает, но операционка просто бросит сообщение WM_TIMER в очередь приложения. И оно будет там болтаться ровно до тех пор, пока функция А не отработает. И лишь после этого оно обработается, и только тогда будет снова вызвана функция А.
Ну а если нет возможности переделать приложение в многопоточное, можно посоветовать только отказаться от идеи грохнуть функцию во время ее работы. Хотя добавить многопоточность в несложную программу - дело десяти минут, см. пост Ktf

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
doca
Гость







СообщениеВт, 12-Июл-2005 9:27 
Цитата

Спасибо за ответы!
Скорее всего придется оставить всё как есть....
Переход на много поточность..??? нет! Большой проект в реальном времени...(графика,сетка....)
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 12-Июл-2005 9:42 
Цитата

Цитата:
Переход на много поточность..??? нет! Большой проект в реальном времени...(графика,сетка....)

неубедительно!
почему такая боязнь многопоточности?
В начало
Посмотреть профиль Отправить личное сообщение
doca
Гость







СообщениеСр, 13-Июл-2005 14:17 
Цитата

1.мало времени
2.то что нужно сделать это куочек большого проекта(изменение повлечёт за собой глобальные перемены...т.е. выпуск новой версии-> см. п1)
В начало
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100