Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1129789532
Дмитрий_Б
2005-10-20 10:25
2005.11.13
Руководство Oracle на русском языке


3-1128508944
dragon_dp
2005-10-05 14:42
2005.11.13
Как узнать существует ли таблица в БД?


1-1130064034
saNat
2005-10-23 14:40
2005.11.13
Прокрутка TScrollBox


1-1129714837
Mamed
2005-10-19 13:40
2005.11.13
Perevod so Ci na paskal


2-1129729392
nikolas
2005-10-19 17:43
2005.11.13
Проблема с массивом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский