purebasic.info

PureBasic forum
Текущее время: Пт авг 23, 2019 1:31 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Чт май 21, 2015 6:23 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Всем привет.
Мужики, Вы прожженные в кодинге :)
Не могу придумать алгоритм для своей задачи, как лучше сделать.

начну из далека.
*цель программы логировать определенные события.
*в программе есть поток1 который создает множество данных (отлавливает событие в винде и создает "строчку" для записи в лог), ну допустим этот поток постоянно пополняет данными (этими созданными "строчками") какой-либо LinkedList.
*есть другой поток2 который должен забирать из LinkedList "строчки" и записывать их в лог (текстовый файл на HDD), ну и наверное удалять записанную строку из ячейки LinkedList-а

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

вопрос, как тогда юзать эти данные двум потокам, чтобы они не пересекались и не мешали друг другу, ни на милисекунду не тормозили работу другого потока в момент удаления чтения заполнения данными... да и возможно ли это вообще?

даже погуглить не знаю как, чтобы поискать примеры алгоритмов в программировании....
Может не надо использовать LinkedList или массив, а есть что-то другое... не пойму как вообще возможно организовать совместное использование одного источника данных, думал про мьютексы, но пока поток2 будет считывать данные залоченные мьютексом, поток1 не сможет их туда записывать, значит нужно создать ещё промежуточный LinkedList в качестве буфера, но блин, эта задача как-то утопична становиться при этой мысли ...

Подскажите плиз.
накидал инфу какая показалась важной, если для решения потребуется уточнение данных, буду стараться сразу же уточнять и добавлять.
Если была подобная тема, прошу ткнуть меня носом в неё ;)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 21, 2015 7:08 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 286
Благодарил (а): 40 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
http://purebasic.info/phpBB3ex/viewtopic.php?f=10&t=4108
Вот специально для подобных задач.
зы. блокировка может возникнуть, в случае меж поточного обмена, но сделано все что-бы она была минимальной.
(не дольше помещения/выборки значения из List (зависит от размера структуры записи, но все равно достаточно быстро))


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 21, 2015 7:16 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11505
Благодарил (а): 4 раз.
Поблагодарили: 469 раз.
Пример в справке как раз под эту задачу. http://www.purebasic.com/documentation/ ... phore.html

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 21, 2015 7:52 pm 
Не в сети
док

Зарегистрирован: Вт мар 03, 2015 12:43 pm
Сообщений: 76
Благодарил (а): 22 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Мой ответ не связан с кодингом, тем более с ПБ, он скорее абстрактный. У нас была подобная проблема, при обработке очень быстрого потока событий. Семафорами проблему было не решить, возникал клинч. Делали так: демон по мере сил копирует данные из входного потока в другой, рабочий поток. Второй демон парсит этот рабочий поток, и сообщает первому демону, что именно можно удалить. Когда во входном потоке возникает пауза, первый демон его чистит. Правда, это делалось в железяке, ей думать было некогда, поэтому использовался буфер данных. Просто хочу сказать, что иногда удобней поменять логику процесса, чем искать решение для языка. Но, возможно, к Вашей задаче это не имеет отношения.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 21, 2015 8:53 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Sven писал(а):
Но, возможно, к Вашей задаче это не имеет отношения.

имеет еще как :) общий принцип понятен,

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

оффтоп
Всем, еще раз отдельное спасибо за уделенное время моему вопросу!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 21, 2015 9:01 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11505
Благодарил (а): 4 раз.
Поблагодарили: 469 раз.
registrymechanic писал(а):
потому что уже понимаю, что полная блокировка хоть и не надолго для потока1 неприемлема.
Неужели реально блокировка на несколько сотен миллиардных долей секунды настолько критична?
Многозадачность ОС внесет намного большую задержку.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 21, 2015 9:37 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Пётр писал(а):
Неужели реально блокировка на несколько сотен миллиардных долей секунды настолько критична?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт май 21, 2015 10:04 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11505
Благодарил (а): 4 раз.
Поблагодарили: 469 раз.
registrymechanic писал(а):
ну может утрирую для поиска оптимального решения
По моему слишком сильно и из-за этого можешь решить задачу не оптимально.

registrymechanic писал(а):
может есть способ именно одновременной работы двух потоков с одними данными без "пауз"
Представь что происходит работа со строковой переменной. Думаю не стоит объяснять что произойдет если один поток читает переменную, а другой решил ее обнулить? Тоже и с памятью. Один поток может работать с ней, в то время как другой решит ее освободить. В итоге прога упадет!

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB