Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проверить, выполняется ли процедура 
:(
    Опции темы
Dufe
Дата 23.3.2005, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 23.3.2005

Репутация: нет
Всего: нет



Есть процедура (ресурсоёмкая), которая выполняется как бы по таймеру. При нажатии на кнопку необходимо выполнить другую процедуру. В этоот момент они конфликтуют. (Нет доступа к памяти...) Использование булевской переменной не катит. Есть ли способ выставить запросы на прерывания или что-то подобное?
А ещё лучше как-то определить конец процедуры и вставить следом отложенную, пришедшую от кнопки.
PM MAIL WWW ICQ   Вверх
z-END
Дата 23.3.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



убери ее из таймера, засунь в поток, и проверяй пока поток жив - она выполняется.


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Dufe
Дата 24.3.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 23.3.2005

Репутация: нет
Всего: нет



Это видеопоток. Я обрабатываю в реальном времени его. Надо, чтобы нажатие на кнопку происходило между приходящими кадрами, которые обрабатываются моей процедурой. smile
PM MAIL WWW ICQ   Вверх
z-END
Дата 24.3.2005, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



так трудно сказать. привиди кусок кода где у тебя происходит "обработка" видеопотока


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Dufe
Дата 24.3.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 23.3.2005

Репутация: нет
Всего: нет



Я не могу его привести. Работаю с DirectShow, который создаёт поток. И по событию на приход нового кадра я его обрабатываю.
PM MAIL WWW ICQ   Вверх
Dufe
Дата 26.3.2005, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 23.3.2005

Репутация: нет
Всего: нет



Неужели нет способа впихнуть действие сразу после окончания процедуры? Смысл в том, что, например по таймеру используется переменная. А при нажатии на кнопку она же должна использоваться. Появляется ошибка доступа к памяти- логично.
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 26.3.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Используй критические секции при доступе к этой переменной...



--------------------
С уважением, г-н Посол.
PM   Вверх
z-END
Дата 27.3.2005, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



Цитата(Dufe @ 26.3.2005, 00:05)
по таймеру используется переменная. А при нажатии на кнопку она же должна использоваться. Появляется ошибка доступа к памяти- логично.
бред полный.. вот пример:
Код

var 
 I: Integer;
{..}
procedure  Fake.Timer1OnTimer (sender: tobject);
 begin
  I := GetTickCount;
  Timer1.Interval := 1;
 end;

procedure Fake.Button1Click (sender: tobject);
 begin
  I := 10;
  I := 15;
 end;

и никакой ошибки в доступе к памяти нет и быть не может т.к. приложение использует 1 (один) поток и все сообщения обрабатываются по очереди. т.е. если в тело процедуры нажатия на педаль поставить такой код:
Код

while i<MaxInt do i:=i+1;
то событие возникающее по таймеру вообще не будет работать до того момента пока i < MaxInt но если вставить нечто вроде такого
Код

while i<MaxInt do 
 begin 
   i:=i+1;
  if i mod 100 = 0 then Application.ProcessMesages;
 end;
то таймер будет работать во время выполнения ProcessMessages.

Если же используются потоки, а не "как-бы таймер" тогда при доступе к данным из одного потока(например приложения) к другому нужна синхронизация см. пост - p0s0l


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.