- 1
- 2
- 3
- 4
- 5
- 6
void sleep_in_qt_ms(unsigned millisec) {
QMutex foo;
foo.lock();
foo.try_lock(millisec);
foo.unlock();
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+24
void sleep_in_qt_ms(unsigned millisec) {
QMutex foo;
foo.lock();
foo.try_lock(millisec);
foo.unlock();
}
sleep в Qt - что, серьезно, чтоли?
особенно порадовало: Warning: Destroying a locked mutex may result in undefined behavior.
действительно, накой нам деструкторы?
bormand 29.03.2013 17:05 # 0
> Warning: Destroying a locked mutex may result in undefined behavior.
Ну дык мутекс мог залочить один поток, а второй вызовет у него деструктор... Вот видимо такие случаи и имелись в виду.
defecate-plusplus 29.03.2013 17:14 # 0
только передать во второй поток этот мутекс по ссылке и указателю (надеюсь, что QMutex - noncopyable, верно?)
раз так, то это плохо вообще для чего угодно, даже для инта, дереференситься к удаленному объекту
bormand 29.03.2013 17:36 # 0
Хм. Ну а нахрена, простите, сдался мутекс, если его не юзают как минимум 2 потока?
defecate-plusplus 29.03.2013 17:41 # +1
например, потоки работают по методам одного и того же объекта, и понятное дело, они оба имеют доступ к мьютексу - члену этого объекта - и тут оба потока обязаны умереть раньше, чем вызовется деструктор мьютекса
bormand 29.03.2013 17:46 # 0
Да тут будет та же самая проблема, если какой-то из потоков надумает выпилить этот объект (да, естественно, так никто делать не будет, как собственно и разрушать мутекс не сняв с него локи).
> оба потока обязаны умереть раньше, чем вызовется деструктор мьютекса
Воот... Правильная мысль. Юзеры объекта должны перестать пользоваться мутексом до вызова его деструктора. А если они перестали им пользоваться - они мало того, что его анлокнули, так еще и должны воздержаться от последующих вызовов lock(). Следовательно проблема с undefined behavior надуманная, и возникает только в кривых случаях, которые сами по себе undefined behavior.
defecate-plusplus 29.03.2013 17:50 # 0
bormand 29.03.2013 17:52 # 0
Вызвал lock() вручную - будь добр вызвать unlock() в том же треде тоже вручную.
P.S. Прога с непарными lock()/unlock() она ведь сама по себе уже бажная...
defecate-plusplus 29.03.2013 18:03 # 0
всё равно в будущем, если придется писать нормально, то придется писать с нуля, а не пользоваться qt-шным примером
постигла меня эта кара к концу недели, измазался уже по самое немогу
roman-kashitsyn 29.03.2013 20:28 # 0
Чувствую, дойдёт дело до Boost.GUI.
defecate-plusplus 29.03.2013 20:49 # 0
> GUI
да нет, самый настоящий QUЇ
TarasB 29.03.2013 21:38 # +4
TEH3OPHblu_nemyx 13.03.2019 14:34 # 0
defecate-plusplus 29.03.2013 17:19 # +3
вот мне прямо сейчас сдался, например, а компилить буст для демки тестовой платформы мне пока что очень западло
> QThread::sleep()/usleep()/msleep()
превосходная идея с клонированием сотни одинаковых функций, вместо того, чтобы сделать нормальный класс, хранящий duration (QMilliseqonds, да) и передавать его один в одну функцию Qsleeq
впрочем, я не удивлен
bormand 29.03.2013 17:37 # 0
roman-kashitsyn 29.03.2013 17:39 # +5
bormand 29.03.2013 17:41 # 0
guest 01.04.2013 23:58 # +2
struct Sleepy : private QThread {
static void sleep(int ms) {
QThread::sleep(ms);
}
};
Vindicar 30.03.2013 08:19 # +1
У вас сарказм отвалился. Вы же это не серьезно, да?
bormand 30.03.2013 08:29 # +3
Dummy00001 01.04.2013 03:07 # +2
много писанины. я пару софтин перевел на double для хранения таймаутов и прочего. 30 - 30 секунд, 0.5 - 500мс, 0.0001 - 100юс, и т.д.
govnomonad 29.03.2013 17:35 # 0
roman-kashitsyn 29.03.2013 17:41 # +1
bormand 29.03.2013 17:47 # 0
roman-kashitsyn 29.03.2013 17:49 # +4
protected sleep подразумевает, что нужно наследоваться, а наследование тут нафиг не нужно. Логично как в PHP
bormand 29.03.2013 17:56 # 0
Что-то типа NetworkInMainThreadException в андроиде.
LispGovno 29.03.2013 19:00 # 0
defecate-plusplus 29.03.2013 19:04 # +4
defecate-plusplus 29.03.2013 19:13 # +6
так бездаqно сделать интеqфейс, когда столько пqостоqа для полёта мысли:
class QMuteqs
QMuteqs::QReqursionMode
QMuteqs::loQ(), unloQ(), tryLoQ()
совсем новыми красками заиграло ведь
bormand 29.03.2013 19:17 # +1
guest8 11.03.2019 02:12 # −999
scriptin 29.03.2013 19:23 # +4
bormand 29.03.2013 19:27 # +2
Xom94ok 29.03.2013 19:59 # +2
bormand 29.03.2013 20:05 # +2
LispGovno 29.03.2013 21:58 # 0
tirinox 29.03.2013 22:09 # 0
scriptin 29.03.2013 22:45 # +1
3.14159265 29.03.2013 22:48 # 0
tirinox 30.03.2013 01:45 # +2
absolut 30.03.2013 11:32 # 0
eth0 30.03.2013 17:57 # 0
roman-kashitsyn 30.03.2013 17:59 # 0
eth0 30.03.2013 18:57 # +1
bormand 30.03.2013 20:23 # 0
Yuuri 01.04.2013 10:21 # −2
guest8 13.03.2019 01:12 # −999
TEH3OPHblu_nemyx 13.03.2019 14:38 # 0
Straiker 13.03.2019 01:08 # 0
TEH3OPHblu_nemyx 13.03.2019 01:10 # 0
Straiker 13.03.2019 01:12 # 0
guest8 13.03.2019 01:15 # −999
TEH3OPHblu_nemyx 13.03.2019 01:19 # 0
KOGDA WESENNIJ PERWYJ GROM,
KAK BY REZWQSQ I IGRAQ,
GROHO^ET W NEBE GOLUBOM.
guest8 13.03.2019 01:26 # −999
TEH3OPHblu_nemyx 13.03.2019 01:47 # 0
kAKAQ BOLX,
aRGENTINA - qMAJKA PQTX - NOLX.
guest8 13.03.2019 02:03 # −999
TEH3OPHblu_nemyx 13.03.2019 14:37 # 0
TEH3OPHblu_nemyx 13.03.2019 14:36 # 0
bormand 13.06.2013 07:30 # 0
real_escape_string 11.03.2019 00:11 # 0
KGeist 11.03.2019 00:37 # 0
3oJloTou_nemyx 14.03.2019 23:07 # 0
guest8 15.03.2019 17:43 # −999
guest8 13.03.2019 15:48 # −999
TEH3OPHblu_nemyx 13.03.2019 15:58 # 0
OCETuHCKuu_nemyx 11.08.2020 23:00 # 0
bormand 12.08.2020 07:15 # 0
gostinho 12.08.2020 09:39 # 0
gost 12.08.2020 09:45 # 0
gostinho 12.08.2020 09:48 # 0
defecate-plusplus 12.08.2020 09:49 # +2
тред работает, создает мутекс для себя, лочит его и его же и ждёт заданное число времени
никакой другой тред не в курсе про этот мутекс
gostinho 12.08.2020 09:52 # 0
MAKAKA 12.08.2020 14:02 # 0
gost 12.08.2020 14:03 # 0