Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизРазгородить парралельное исполненийе Найти похожие ветки
← →
Still Swamp (2005-09-11 22:37) [0]У меня классический случай.
Работает приложение. По таймеру TimeSetEvent запускается моя процедура. В нутри нее общитывается некий массив что занимает некоторое время. В этот момент основная программа или того хуже пользователь добавляет элемент в этот массив. Ну естно последствия могет быть весьма печальными.
Как выкрутиться из этой ситуации?
Я поставил флаг на исполнение таймерной процедуры те в любой момент я знаю исполняется ли она или нет.
Далее... по идее мне надо дожидаться везде ее завершения отказывать - это не везде нереально.
Как быть?
← →
Fay © (2005-09-11 23:06) [1]2 Still Swamp (11.09.05 22:37)
1) IMHO, стоит задуматься о применении критических секций.
2) Выкладывай код.
← →
Still Swamp (2005-09-11 23:16) [2]Код???
С него толку не будет да и объемен он.
Это процедура таймера.
procedure Tm(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD); stdcall;
var
MeshRootObject:TMeshRootObject;
iMesh:TMesh;
begin
MeshRootObject:=Ptr(dwUser);
if not MeshRootObject.MeshList.Drawing then MeshRootObject.MeshList.Execute;
end;
Это создание таймера...
AddrMesh:=@MeshRootObject;
IDDrawTimer:=TimeSetEvent(1, 0, @Tm, AddrMesh^, TIME_PERIODIC);
остальное обычные циклы... клики
← →
Fay © (2005-09-11 23:50) [3]2 Still Swamp (11.09.05 23:16) [2]
Из кода не следует, что потоков несколько.
А их несколько? Если нет, то вопрос закрыт.
← →
Still Swamp (2005-09-11 23:58) [4]я проверил...
я повесил внутри своего приложения пустой цикл. в таймерной процедуре поставил BEEP. Запустил таймер. Потом цикл... Машиная стоит и бипает при рабочем цикле. Это конечно не означает что запустился второй процесс, однако это означает что в любой обработке внутри которой я расчитываю что ничего не изменится, вторгается работа таймерной процедуры. Мягко говоря, я не могу при каждом опасном действии симафорить этой таймерной функции чтоб не запускалась.
← →
Still Swamp (2005-09-12 00:27) [5]И еще я проверил... во время исполнения таймерной процедуры продолжается работа приложения.... значит - много поточность.
← →
Fay © (2005-09-12 04:18) [6]2 Still Swamp (11.09.05 23:58) [4]
Прошу прощения, ошибочка вышла 8(
The timeSetEvent function starts a specified timer event. The multimedia timer runs in its own thread. After the event is activated, it calls the specified callback function or sets or pulses the specified event object.
Если код не очень секретный и не шибко большой, то привели его в количестве достаточном, чтобы
1) его не писать самим
2) понять, что исправить
← →
Fay © (2005-09-12 04:19) [7]А можешь и не приводить код, а просто налечь на крит. секции. 8)
← →
Still Swamp (2005-09-12 13:40) [8]ЧТо такое критсекции...
В крадце - если можно.
← →
ShiFT (2005-09-12 14:57) [9]тут почитай.
http://delphimaster.net/view/1-1124785381/
← →
Digitman © (2005-09-12 15:19) [10]
> проверил... во время исполнения таймерной процедуры продолжается
> работа приложения.... значит - много поточность
Гениальное умозаключение.
Мол, я не создавал (ни явно ни неявно) никаких дополнительных потоков, но процесс моего приложения тем не менее вдруг с какого-то перепугу оказался многопоточным, сам по себе причем.
Чудеса да и только !)
← →
Fay © (2005-09-12 15:58) [11]2 Digitman © (12.09.05 15:19) [10]
Да не, не врёт уважаемый Still Swamp.
Эта хрень, которая TimeSetEvent создаёт поток.
← →
Digitman © (2005-09-12 16:05) [12]
> Fay © (12.09.05 15:58) [11]
> не врёт уважаемый Still Swamp
ну а раз не врет, то вчитавшись в справку к ф-ции TimeSetEvent() он должен понимать, что ф-ция Tm() неспроста вызывается в доп.потоке .. там ведь, в справке, черным по белому написано :
The multimedia timer runs in its own thread
значит, не с луны этот поток свалился ...
← →
Fay © (2005-09-12 16:12) [13]2 Digitman © (12.09.05 16:05) [12]
Это были вариации на тему [6]?
8)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c