Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.023 c
1-1133800282
Andrey.Ru
2005-12-05 19:31
2006.01.08
Как TIMAGE с рисунком сделать полупрозрачным?


2-1135150870
Alex7
2005-12-21 10:41
2006.01.08
обращение к процедуре родительской формы


2-1134835627
dude
2005-12-17 19:07
2006.01.08
we56er это имя?


4-1130921832
Still Swamp
2005-11-02 11:57
2006.01.08
Как соорудить окошко типа PopUp


2-1135058284
oleg777
2005-12-20 08:58
2006.01.08
Ошибка в запросе при проверке пользователя MSSQL 2000