Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Вниз

синхронизация потоков в API   Найти похожие ветки 

 
VirEx ©   (2005-12-12 17:00) [0]

всё на API
вот такая петрушка:
есть главная программа, она грузит dll в которой:
1) делаю поток CreateThread, указываю процедуру обработки ну и т.п.
2) в процедуре обработки (аналог Execute в TThread) делаю черное дело :)
3) и т.п.
дык вот - нужен аналог Synchronize(моя_функция), я пробовал Event"ами, что-то всёравно иногда поток опережает работу моей функции, вообщем не ждёт её завершения


 
Игорь Шевченко ©   (2005-12-12 17:14) [1]


> нужен аналог Synchronize(моя_функция),


А TFS не судьба почитать ?


 
VirEx ©   (2005-12-12 17:38) [2]

TFS? ну я сорц Classes.pas пострел но нифига не понял, и в как по хэлпам по примерам сделал типа мьютекс или эвент, но нифига не канает


 
Digitman ©   (2005-12-12 17:43) [3]


> я сорц Classes.pas пострел но нифига не понял


значит - в Бобруйск


 
Игорь Шевченко ©   (2005-12-12 17:43) [4]


> нифига не понял


Незнакомые слова встретились ?


 
MBo ©   (2005-12-12 17:48) [5]

>я пробовал Event"ами, что-то всёравно иногда поток опережает работу моей функции

Стоит изложить код или хотя бы логику


 
Gero_   (2005-12-12 18:00) [6]

3 мастера — 3 мнения )


 
Германн ©   (2005-12-12 18:03) [7]


> Gero_   (12.12.05 18:00) [6]
>
> 3 мастера — 3 мнения )

Мнения - одинаковые, слова разные. Имхо.


 
Alexander Panov ©   (2005-12-12 18:06) [8]

VirEx ©   (12.12.05 17:00)
дык вот - нужен аналог Synchronize(моя_функция), я пробовал Event"ами, что-то всёравно иногда поток опережает работу моей функции, вообщем не ждёт её завершения


Аналога нет, но есть объекты синхронизации.
Один из них - критические секции.

Смю. InitializeCriticalSection в WIN32 SDK или MSDN.


 
VirEx ©   (2005-12-12 18:11) [9]


>  [3] Digitman ©   (12.12.05 17:43)


>  [4] Игорь Шевченко ©   (12.12.05 17:43)

а от вас я вижу как всегда помощи никакой, ну ладно, если подумать то получается вот что:
синхронизация в TThread привязана к главному (main) потоку, и создаваемый поток добавляет в список главного объекта/класса своё событие  (event), и вновь созданный поток ждёт, пока главный поток (создавший его) не просигнализирует через это событие (SetEvent или PulseEvent либо это собитие главный поток убъет CloseHandle или что там еще...)

SyncProc.Signal := CreateEvent(nil, True, False, nil);//делаем событие
SyncList.Add(@SyncProc);//добавляем в список событий

if Assigned(WakeMainThread) then
         WakeMainThread(SyncProc.SyncRec.FThread);//ждемс сигналы главного потока

WaitForSingleObject(SyncProc.Signal, INFINITE);//ждемс пока главный поток не "просигналит" в наше событие


в VCL приложении (ну или как вам будет угодно: в приложении использующем VCL) форма это класс в котором есть список событий всех дочерних компонентов, и там эта синхронизация "катит", т.е. главный поток генерит (ну т.е. сигналит) неприрывно пробегаясь по списку событий события

но у меня чисто API приложение (ну или как вам будет...) и я делал примерно вот такое:
t:=CreateThread(nil,0,@Exec,nil,CREATE_SUSPENDED,tId);
...
ResumeThread(t);
...
procedure Exec;
var
 params:Tpapams
begin
...
e:=CreateEvent();
CallMyProc(params);//вызываем процедуру обработки
WaitForSingleObject(e,infinite);//ждемс сигнала
end;

procedure CallMyProc(p:Tpapams);
begin
...
работаем с файлами и т.п.
...
SetEvent(e);//подаём сигнал что уже готово и можно двигаться дальше
end;


 
VirEx ©   (2005-12-12 18:18) [10]

и еще забыл в procedure Exec всё написаное мной заключенов цикле


 
Игорь Шевченко ©   (2005-12-12 18:22) [11]


> а от вас я вижу как всегда помощи никакой


http://www.ln.ua/~openxs/articles/smart-questions-ru.html


 
Alexander Panov ©   (2005-12-12 18:22) [12]

VirEx ©   (12.12.05 18:18) [10]
и еще забыл в procedure Exec всё написаное мной заключенов цикле

Нпиши цель. Т.е. укрупненно твой процесс работы с потоком - что хочешь получить.


 
MBo ©   (2005-12-12 18:26) [13]

Код реальный?

Какой смысл вкладывается в последовательность:

CallMyProc(params);//вызываем процедуру обработки
WaitForSingleObject(e,infinite);//ждемс сигнала

причем e устанавливается в CallMyProc

Смахивает на неправильную логику, безотносительно к доп. потокам


 
VirEx ©   (2005-12-12 18:31) [14]


>  [12] Alexander Panov ©   (12.12.05 18:22)

ну плагин для WinConsul делаю, вообщем мониторинг обращений к файлам/папкам через ReadDirectoryChangesW, нужно писать в лог

так то всё работает (я это переводил из компонента сделанного на классе TThread), но без "правильной" синхронизации запись строки в лог происходит два раза на событие, одновременно, т.е. события соревнуются кто раньше запишет в файл, а мне нужно дождаться одного а затем уже пусть работает след.


 
Alexander Panov ©   (2005-12-12 18:34) [15]

VirEx ©   (12.12.05 18:31) [14]


Тогда используй критичские секции. см. [8]


 
VirEx ©   (2005-12-12 18:35) [16]


>  [13] MBo ©   (12.12.05 18:26)
> Код реальный?
>
> Какой смысл вкладывается в последовательность:
>
> CallMyProc(params);//вызываем процедуру обработки
> WaitForSingleObject(e,infinite);//ждемс сигнала
>
> причем e устанавливается в CallMyProc
>
> Смахивает на неправильную логику, безотносительно к доп.
> потокам


e (сигнал, THandle) объявлен глобально, а в CallMyProc я "сигналю" в него, чтобы в Exec продолжить дальше выполнение, WaitForSingleObject(e,infinite);//ждемс сигнала ну разве не понятно?


 
VirEx ©   (2005-12-12 18:40) [17]


> [15] Alexander Panov ©   (12.12.05 18:34)
> VirEx ©   (12.12.05 18:31) [14]
>
>
> Тогда используй критичские секции. см. [8]

я с EnterCriticalSection и т.п. не работал, и незнаю что он может дать, и что "обрамить" критической секцией: CallMyProc(params);//вызываем процедуру обработки или что? :)


 
Alexander Panov ©   (2005-12-12 20:21) [18]

Почитай статьи на этом сайте и в интернете про потоки - вопросы отпадут.
Рекомендую вот эту ссылку:
http://forum.vingrad.ru/index.php?showtopic=60076



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
4-1130767725
RomeoGolf
2005-10-31 17:08
2006.01.08
Свернуть дочернее окно в панель задач


1-1134048533
Mishenka
2005-12-08 16:28
2006.01.08
Можно ли у TImage сделать прозрачный фон?


3-1131976154
КодеКорешь
2005-11-14 16:49
2006.01.08
Ограничение числа записей в таблице


3-1131976444
DelphiLexx
2005-11-14 16:54
2006.01.08
Выделить строку в DBGrid


2-1135149669
speaker
2005-12-21 10:21
2006.01.08
поиск по базе данных





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский