Текущий архив: 2006.01.08;
Скачать: CL | DM;
Внизсинхронизация потоков в 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;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.007 c