~AreEnn
~R4SAS
~acetone
~orignal
~villain
&N00B
+relaybot
DUHOVKIN_
Guest7184
Most2
Nausicaa
Nikat
Ruskoye_911
Vort
Xeha
anon3
b3t4f4c3
fidoid
karamba_i2p
nemiga
not_bob_afk
onon
plap
poriori
profetikla
qend
segfault
soos
teeth
tetrimer_
uis
un
unlike
user
vade
weko
whothefuckami
R4SAS
orignal: как можно два while цикла в run() запустить?
orignal
можно но зачем? ))
R4SAS
или как лучше делать если надо одновременно выполнять while программы, но у UI должен быть свой в этот момент
R4SAS
это я к pboted приделываю трей
orignal
надо поллить
orignal
есть такая штука как eventfd например
orignal
ну а лучше впихини в бустовский io_service
R4SAS
она от буста отказывается
orignal
тогда eventfd и poll
R4SAS
смотри какой код
orignal
под виндой WaitForMultipleObject есть
R4SAS
while (GetMessage(&msg, NULL, 0, 0)) -- здесь ловятся мессаги из winapi
orignal
либо тупо сделать два терда
orignal
ну это стандратный виндосый
R4SAS
в нем 2 функции надо крутить
R4SAS
TranslateMessage(&msg);
R4SAS
DispatchMessage(&msg);
orignal
это понятнл
orignal
а тебе что надо прикрутить?
R4SAS
сие
orignal
так она же просто на условной переменной висит
R4SAS
да, но смотри в чем дело
orignal
где она посылает m_check_cv notify?
orignal
вот в том месте надо послать виндовое сообщение
R4SAS
bote::network_worker.init () вызывает создание SAM сессии
orignal
чтобы оно подхватилось
R4SAS
и из-за этого виснет отлов сообщений из WinAPI
orignal
сэм пусть крутится в отдельном треде
R4SAS
не знаю где
R4SAS
ща гляну
orignal
то что после строки 133 под std::async
R4SAS
m_check_cv приходит из EmailWorker
R4SAS
хотя не
R4SAS
в stop() ведь
orignal
вот этот notify надо транслировать а SendMessage виндовый
R4SAS
чтобы таймер при остановке сбросился
R4SAS
т.е. надо вместо m_check_cv.notify_one () отправлять остановку?
R4SAS
или чего:
R4SAS
через SendMessage (WM_EXIT) например (условно)
orignal
да SendMessage
orignal
а в фнукции обработки его ловить
R4SAS
сейчас посмотрим...
R4SAS
хм, мне по идее даже этот PostMessage не нужен
R4SAS
я всё равно в stop() приду после завершения GetMessage
R4SAS
хотя, нужен только если я делаю отлов сигналов
R4SAS
правильно?
R4SAS
видимо нет, ибо блочит все равно...
R4SAS
такс, SAM в bote::network_worker.start () оказывается
orignal
checker.get(); туда нельзя
orignal
в главный цикл
R4SAS
polistern: ты куда закидываешь всякие функции, которые могут вызываться в разных местах?
polistern
В Context кидала, но вот теперь думаю почистить, а новое место не придумала пока.
R4SAS
util нужен
R4SAS
контекст... наверно
R4SAS
это одно
R4SAS
второе: POP3 так и блочится где то?
R4SAS
[New Thread 2792.0x3b30]
R4SAS
17:42:17@471 INFO Daemon: Starting POP3 server at 127.0.0.1:9110
R4SAS
17:48:04@471 INFO Daemon: Start shutting down
R4SAS
17:48:04@471 INFO POP3: Stopping
R4SAS
17:48:04@471 INFO POP3: Sockets closed
R4SAS
17:48:04@471 INFO POP3: Stopped
R4SAS
17:48:04@471 INFO Daemon: Stopped
R4SAS
и потом через секунд 15:
R4SAS
[Thread 2792.0x3b30 exited with code 0]
R4SAS
и все остальные треды
R4SAS
может конечно я чего то не понимаю
R4SAS
я сейчас думаю обзывание тредов добавить, как в ш2зв делал
polistern
Я если и буду куда лезть в ближайшее время, так только в DHT и Email, так что не помешаю. Utils ок, наверное, потом подумаю, не критично. По тредам на винде залипание? Под линукс вроде ок.
polistern
Я вроде везде сделала неблокирующие вызовы, но может ещё чего наколдовать надо.
R4SAS
да, на винде
R4SAS
попробую посмотреть чего висит в тредах
R4SAS
orignal: почему может висеть на pthread_join ()?
orignal
потому что тред не завершается
orignal
ждет чего то
R4SAS
далее по стеку WaitForSingleObjectEx ()
orignal
m_started не зануляешь
orignal
я бы начал с этого
orignal
может stop не вызвался вовремя
orignal
я понимаю
R4SAS
я думаю сначала стоп то вызвался
R4SAS
но там таймер то не закончился
R4SAS
и при деструкторе оно висит на join из-за этого
orignal
так напечатай в run что происходит
R4SAS
ок, сейчас гляну
R4SAS
01:30:21@471 INFO Daemon: Stopped
R4SAS
01:31:07@411 DEBUG DHT: Run: Post-sleep
R4SAS
01:31:07@411 DEBUG DHT: Run: Loop end
R4SAS
угу
R4SAS
надо как то преждевременно таймер килять
orignal
так у тебя это не таймер
R4SAS
точнее не таймер, а этот sleep
orignal
никак
orignal
делай таймер
orignal
вообще вот так делать не надо как там
R4SAS
ну вот опиши для polistern как надо)))
orignal
boost::deadline_time wait
orignal
вместо sleep
orignal
ну а по хорошему надо понимать зачем
orignal
там тред должен чего то ожидать
orignal
так вот надо подвешивать на ожидании этого а не sleep
orignal
пример есть в AddressBoo.cpp
R4SAS
ну, polistern, дел хватает)))
R4SAS
ага, вижу этот тред, где sleep крутится
R4SAS
#5 0x00007ff697d32d01 in void std::this_thread::sleep_for<long long, std::ratio<1ll, 1ll> >(std::chrono::duration<long long, std::ratio<1ll, 1ll> > const&) ()
R4SAS
#6 0x00007ff6979f3467 in bote::DHTworker::run() ()
R4SAS
и как и думал, это не единственный
R4SAS
#5 0x00007ff697d32d01 in void std::this_thread::sleep_for<long long, std::ratio<1ll, 1ll> >(std::chrono::duration<long long, std::ratio<1ll, 1ll> > const&) ()
R4SAS
#6 0x00007ff6979ffeb4 in bote::EmailWorker::run() ()
R4SAS
или же, можно ей сделать костылем
R4SAS
через запись времени последнего выполнения
R4SAS
и слипом в 1 секунду
R4SAS
а как именно она сделает - решать ей
orignal
не надо вообще писать код со sleep
orignal
кроме как в главном треде который main
orignal
он там нужен чтобы не завершлось и не жрало проц
R4SAS
да я понимаю
orignal
понимаешь sleep это из времен однопоточных приложений
orignal
когда вот был один поток выполнения без всяких синхронизаций
orignal
так во времена доса писали ))
orignal
считая что машина целиком в твоем распоряжении
R4SAS
я тогда не понимаю одного
R4SAS
> По тредам на винде залипание? Под линукс вроде ок.
R4SAS
как оно под линукс может быть ок?
orignal
а x3
orignal
разная реализация тредов
R4SAS
разная реализация sleep? )))
R4SAS
у линукса быстрая фаза сна, а у маздая глубокая?)))
orignal
так а через минуту что просиходит?
R4SAS
выше кидал же
R4SAS
наступает момент post-sleep, окончание петли, смерть
orignal
ye
orignal
ну
orignal
я не понимаю в чем проблема то?
R4SAS
в том что sleep
orignal
ну завершится через минуту и че?
R4SAS
нафиг ждать минуту?
orignal
так сделать не sleep (60) а цикл из 60 по sleep(1)
R4SAS
алё
orignal
в нем провреять m_started
orignal
кстати
R4SAS
> и слипом в 1 секунду
orignal
он volatile недеюсь?
R4SAS
я уже предложил
orignal
ну так
orignal
так volatile или нет?
R4SAS
не знаю
R4SAS
ща гляну
orignal
это важно
orignal
потому что копилятор может соптимизировать
orignal
и выкинуть проверку
orignal
думая что раз эта переменная внутри цикла не меняется то нахуя ее проверять
R4SAS
это голый слип
R4SAS
std::this_thread::sleep_for (std::chrono::seconds (60));
R4SAS
или ты про m_started?