IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2022/11/02
~AreEnn
~R4SAS
~orignal
~villain
&N00B
+Xeha
+relaybot
DUHOVKIN
Guest7184
Leopold
Most2
Nausicaa
Ruskoye_911
Vort
acetone
anon2
b3t4f4c3
karamba_i2p
nemiga
not_bob_afk
plap
poriori
profetikla
soos
teeth
un
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 я не понимаю в чем проблема то?
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?