Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: использование usleep
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
borune
В продолжение темы. Нашел метод QThread::usleep(unsigned long usecs), который говорит потоку спать usecs микросекунд. Правда метод объявлен как протектед. Поэтому я сделал класс-наследник от QThread, где переопределил метод usleep следующим образом:
void delayer::usleep(unsigned long usecs)
{
   QThread::usleep(usecs);
}

Далее для того, чтобы мой слот вызывался, например, с частотой 2 кГц (т.е. 2 раза за миллисекунду) пробую делать так:
void myClass::mySlot()
{
...
delayer delay;
delay.usleep(500);
QTimer::singleShot(0,this,SLOT(mySlot()));
}

Но такое решение не работает - слот вызывается раз в миллисекунду. Аргумент метода usleep ни на что не влияет, даже если делаю его равным 0, все равно вызов происходит с частотой 1 кГц. Если закаментить вызов метода usleep, то слот вызывается гораздо чаще (с частотой около 10 кГц).

Просто не очень желательно использовать сторонние библиотеки, хочется реализовать все в qt. Как сделать, чтоб usleep работал, подскажите пожалуйста.
Iron Bug
usleep есть только в никсах. в венде его нет. так что это не кроссплатформа.
да и в никсах он и так доступен, без всяких Qt.

лучше не изобретать велосипед. если нужна кроссплатформа с быстрыми слипами - это boost. другие варианты мне не известны, по крайней мере. стандартные реализации C++11 под вендой тоже не работают (только 1 мс).
borune
а что если сделать так:
void myClass::mySlot()
{
...
for(int i=0; i<TIME; ++i){}
QTimer::singleShot(0,this,SLOT(mySlot()));
}

:D
Ведь по идее операция инкремента атомарна, а значит время ее выполнения зависит только от частоты процессора. Другой вопрос, как будет распределено время между процессами и когда именно этот поток получит право на выполнение. Но разве нельзя использовать приведенный выше метод для внесения хотя бы приблизительно известной задержки?

TIME, естественно, следует определить заранее, выполняя данный цикл с заданным числом повторений и засекая время, которое займет его выполнение на данном компьютере.
Iron Bug
Цитата(borune @ 18.11.2013, 16:11) *
разве нельзя использовать приведенный выше метод для внесения хотя бы приблизительно известной задержки?

использовать можно хоть операцию инкремента. вопрос лишь в том, что эта фигня сожрёт 100% проца и всё равно будет работать нестабильно.
Litkevich Yuriy
вообще слоты и сигналы вещь не быстрая, если тебе нужно что-то делать действительно быстро, то нужно идти по пути явного вызова функции.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.