Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2013, 12:38   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию Создание процедуры/функции, с независимым выполнением.

Собственно вопрос:
Есть переменная INTEGER, которая имеет начальное значение к примеру:
10000

Нужно создать процедуру/функцию или ещё что-то, что будет каждую секунду отнимать 1000 от переменной:

Код:
var
i:integer;
begin
i:=1000000;
while i>0 do begin
sleep(1000);
dec(i,1000);
end;
i:=0;
end;
Встала такая проблема:
Допустим что:
Переменная I имеет число к пример 1000000
Нужно запустить эту функцию/процедуру и затем уже выполнять другой код тут же, пример:
Код:
begin
TimeEnd;
showmessage('bb');
То есть к примеру запустится процедура и сразу же выведется сообщение, такое не возможно, но нужно как-то реализовать, кто знает как?
Winexcel вне форума Ответить с цитированием
Старый 05.11.2013, 12:47   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ни чего не понял
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.11.2013, 12:52   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

таймер проще всего.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.11.2013, 13:59   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Нужно запустить эту функцию/процедуру и затем уже выполнять другой код тут же, пример:
А какой все-таки код надо выполнять "параллельно" со счетом Dec(i,...);
1. Независимый от этого i. Тогда зачем вообще это считать (простой таймер на NN секунд оповестит нас в заданное время).
2. Зависимый от I. Например код показа этого самого i на одной из форм, в то время как сама форма(программа) занята сложными и длинными расчетами (или ждет каких-то данных из Internet).
3. другие варианты.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.11.2013, 14:15   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Цитата:
Сообщение от Winexcel Посмотреть сообщение
Нужно запустить эту функцию/процедуру и затем уже выполнять другой код тут же
Потоки. http://forum.vingrad.ru/forum/topic-60076.html
phomm вне форума Ответить с цитированием
Старый 05.11.2013, 14:41   #6
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
А какой все-таки код надо выполнять "параллельно" со счетом Dec(i,...);
1. Независимый от этого i. Тогда зачем вообще это считать (простой таймер на NN секунд оповестит нас в заданное время).
2. Зависимый от I. Например код показа этого самого i на одной из форм, в то время как сама форма(программа) занята сложными и длинными расчетами (или ждет каких-то данных из Internet).
3. другие варианты.
Вариант №2. Самое логичное будет конечно создавать таймер, но таймер придётся по видимому создавать программно на каждый поток. Собственно эта идея мне и пришла сразу в голову.

Цитата:
Сообщение от phomm Посмотреть сообщение
Выделять поток будет не очень хорошо, тут будет очень много путаницы, так как в программе неограниченное число потоков, и если условие выполнилось:
то мы блокируем выполнение кое-какого кода на 1 час, в моём случае это:
Код:
i:=3600000
Winexcel вне форума Ответить с цитированием
Старый 05.11.2013, 14:52   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Вариант №2. Самое логичное
Если расчеты (что вряд ли), то расчеты в основном потоке НЕ ДАДУТ возможности по показу чего либо (без дополнительных ухищрений!).
Если получение данные в синхронном режиме, то тоже.
Асинхронный режим. Если он поддерживается используемыми компонентами доступа. Или получение данных в доп. потоке.

+ ОДИН таймер в основном потоке, используемый для обновления ВСЕХ значений счетчиков (для всех потоков получения информации).
Вполне допустим вызов процедур объекта Ttread БЕЗ доп. синхронизации c изменением переменной (счетчика) из основного потока. ПРИ соблюдении условия внутри потоковой процедуры(Execute) данная переменная (свойство) НЕ МЕНЯЕТСЯ.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.11.2013, 18:03   #8
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Если расчеты (что вряд ли), то расчеты в основном потоке НЕ ДАДУТ возможности по показу чего либо (без дополнительных ухищрений!).
Если получение данные в синхронном режиме, то тоже.
Асинхронный режим. Если он поддерживается используемыми компонентами доступа. Или получение данных в доп. потоке.

+ ОДИН таймер в основном потоке, используемый для обновления ВСЕХ значений счетчиков (для всех потоков получения информации).
Вполне допустим вызов процедур объекта Ttread БЕЗ доп. синхронизации c изменением переменной (счетчика) из основного потока. ПРИ соблюдении условия внутри потоковой процедуры(Execute) данная переменная (свойство) НЕ МЕНЯЕТСЯ.
Объясню программно:

Код:
type
 TWorkBot = class(TThread)
 ...
  public
  blockrazdel:integer;//переменная при включении потока = 0
..  
end;
implementation

procedure TWorkBot.Execute;
begin
if blockrazdel=0 then
вызов процедуры

end;
end.
Вот нужно сделать счётчик, в проуедуры если возникло некое условие, то
Код:
blockrazdel:=3600000
и запускается таймер или ешё что для того чтобы из этой переменной каждую секунду вычитать 1000. И параллельно после того как запустится процесс вычитания из blockrazdel, выполнять другой код в потоке.

Последний раз редактировалось Winexcel; 05.11.2013 в 18:05.
Winexcel вне форума Ответить с цитированием
Старый 06.11.2013, 10:17   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
и запускается таймер или ешё что для того чтобы из этой переменной каждую секунду вычитать 1000. И параллельно после того как запустится процесс вычитания из blockrazdel, выполнять другой код в потоке.
Это ВАША идея реализации какой-то неизвестной НАМ задачи. Чтобы получить правильный ответ (ДРУГУЮ реализацию той же задачи) надо описать задачу здесь. (без таймеров, процедур и переменных).
Сага о X,Y,Z
X исходная задача
Y ваша куча таймеров и переменных
Z1 мой один таймер и ...
Z... другие предложения

Есть куча потоков, которые что-то делают, надо следить за временем их выполнения и если они трудятся очень долго, то менять их поведение.

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

Еще 2 Z
Если ВАМ надо просто ограничить время работы расчетного потока по времени (и при этом времени реальном, а не временем работы потока) и сделать это внутри потока, то...

1. заводим локальную переменную
private
statrttime: TdateTime;
2. при старте потока засекаем время
starttime:=Now;
3. вычисляем контрольное время
4. при работе периодически в любом удобном нам месте (например в начале каждой итерации цикла) проверяем контрольное время сравниваем его с текущим и если надо меняем поведение потока.

В любом случае если вы хотите правильно остановить поток, вы должны обеспечить возможность завершения потоковой процедуры Execute периодически проверять какой либо флаг.
Код:
while not terminated // завершение по проверке стандартного флага
А для осуществления ограниченного по времени получения данных, в компонентах предусмотрен timeout.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.11.2013 в 10:24.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск с независимым регистром bigbang22222 Паскаль, Turbo Pascal, PascalABC.NET 3 12.06.2012 10:05
Проблема с выполнением функции 2-й раз. men232 Visual C++ 1 15.02.2012 16:41
Процедуры и функции kuy Паскаль, Turbo Pascal, PascalABC.NET 0 21.10.2011 18:21