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

Вниз

Как правильно организовать поток?   Найти похожие ветки 

 
tim   (2003-10-07 10:58) [0]

Добрый день, уважаемые. Мне небходимо в одном потоке заполнять массив данными и, соответственно, если они там есть, то активируется второй поток, который эти данные обрабатывает и после обработки из массива удаляет и приостанавливается. И так далее.
Подскажите как наиболее грамотно организовать логику?


 
N169   (2003-10-07 11:35) [1]

Можно посадить "manual reset" event, изначально сброшенный.
Первый поток заливает данные и устанавливает event, начинает работу 2-й поток (который должен ожидать установки event, чтобы продолжить работу).
После того как 2-й поток отработает и удалит данные, он (П#2) сбрасывает event и делает на него синхронизацию с помощью WaitForSingleObject().
Далее циклы могут повторяться.

+ П#1 не должен манипулировать общими данными П#1 и П#2, пока event установлен.


 
tim   (2003-10-07 11:44) [2]

"manual reset" event - это флаг, как я понимаю?
или не понимаю?

проблема в том, что первый поток через определенный промежуток времени обегает массив и если элемент массива (поле Время)
равен текущему, то этот элемент попадает в очередь. А второй поток, основываясь на данных из очереди делает бэкап (SQL Server но это не принципиально). Соответственно, я не могу приостановить добавление данных из первого потока, так как определенное задание может проспать!
Хотя, очередь - это всего лишь набор указателей и весьма несущественно, если она в это время пополнится, я могу считать себя правым?


 
Polevi   (2003-10-07 12:04) [3]

создаешь очередь и семафор (CreateSemaphore)

procedure AddData(SomeData);
begin
EnterCriticalSection
try
DataList.Add(SomeData)
ReleaseSemaphore
finally
LeaveCriticalSection
end;
end;

основной поток вызвает AddData
второй поток WaitForSingleObject"ом ждет семафор
как только семафор сигналит - очередь данных не пуста - поток просыпается и выбирает данные из очереди

procedure GetData:TSomeData
begin
EnterCriticalSection
try
Result:=DataList[0];
DataList.Delete(0);
ReleaseSemaphore
finally
LeaveCriticalSection
end;
end;


 
Polevi   (2003-10-07 12:05) [4]

упс, ReleaseSemaphore в GetData не нужен, конечно же


 
tim   (2003-10-07 12:18) [5]

спасибо, попробую разобраться, хотя вроде свой вариант с бесконечном цикле во втором потоке, который время от времени засыпает и будится при добавлении данных в первом потоке, тоже заработал.
хотя, конечно, вариант с критическими секциями будет пограмотней.
кстати интересная особенность, не относящаяся к делу:
для экспериментов создал две пустые и абсолютно одинаковые базы в MS Sql 2000. забэкапил своей программой. Результат:
a1.bak 3.31 mb
a2.bak 2.48 mb
у кого есть комментарии?



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

Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.004 c
4-11716
ZEE
2003-10-09 16:57
2003.12.04
деактивация окна


9-11577
Vin_Ghost
2003-05-20 23:18
2003.12.04
алгоритм поиска пути


4-11730
igornov
2003-10-07 18:20
2003.12.04
Как зная хендл окна прочитать его заголовок и заменить своим


6-11678
electric
2003-10-05 20:43
2003.12.04
Докачка почты


8-11625
waw
2003-07-31 14:38
2003.12.04
Как сохранить один кадр фильма в JPEG?





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