2009-10-30 4 views
0

Мое время, затрачиваемое процессорным процессором, намного больше, чем хотелось бы (2 дисплея снимают до 80-90%). Я использую Qtimers, а некоторые из них имеют длину до 2 мс. В любой момент времени у меня может быть более 12 таймеров на дисплей - 2 мс, 2 мс, 2 мс, 250 мс, а остальные - от 200 мс до 500 мс. Было бы лучше, если бы я использовал потоки для некоторых или всех этих (особенно коротких)? Будет ли это иметь большое значение?QTimer vs отдельные потоки

+0

Ваши литы заняты, подождите, с этими таймерами? Могут быть некоторые другие способы сохранить живые потоки. – bua

+0

bua: Ну, я не использую потоки напрямую. Если Qt использует их за сценой, я не знаю об этом. У меня создалось впечатление, что он просто запускал один цикл в основном потоке и выполнял все расписания. – Scott

+0

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

ответ

2

Основная проблема времени будет заключаться в таймерах с высоким приоритетом. Во-первых, убедитесь, что вам действительно нужны эти каждые 2 мс, во-вторых, чтобы преодолеть некоторые из накладных расходов в классе QTimer, вы можете сгруппировать три таймаута 3 2 мс в один, и каждый раз, когда он отключается, просто выполняйте 3 раздела кода последовательно. Я не думаю, что нить разрешит проблему.

+0

Ну, эта короткая скорость таймера основана на скорости передачи данных RS-232 со скоростью 19200 бод. Один таймер для чтения, один таймер для записи и один таймер для проверки буфера. Таймер 250 мс для тайм-аутов ответа (дисплей должен ответить в течение этого времени). Остальные таймеры обновляют отображаемый текст или некоторые другие операции. Я могу определенно объединить три таймера в одном, хотя. – Scott

+3

Ах, неудивительно, что тогда. Извините, но ваш вопрос действительно выглядит так: «Нужна ли мне нормальная или отвертка Philips, чтобы вставить гвоздь?». Нет, вам нужен молоток. И в этом случае вам, вероятно, понадобится ввод/вывод с прерываниями. Поддерживает ли ваш Qt последовательный класс 'QIODevice :: readyRead'? – MSalters

1

2 мс швов подозревают меня. Люди читали и записывали в Serial Ports по 19200 бод в течение многих лет (например, на 486 аппаратных средствах) без перегрузки процессора. Возможно, ваш подход ошибочен.

Что вы используете для доступа к порту? Похоже, вы опросили их, если api поддерживает заблокированные чтения и пишет, что это будет гораздо лучший подход.

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

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

+0

486? Я использовал его на 4.77 Mhz 8086. Это помогло, что мой компьютер имел 16550A UART с 16-байтовыми буферами; 19200 бод составляет около 2000 байт в секунду, что означает, что вам нужно очистить буфер только каждые 8 ​​мс. И это прерывается, поэтому нет необходимости в тайных таймерах. – MSalters

+0

Я не получил 16550A, пока не получил свой 486, мой 386SX имел 16550, такую ​​же скорость, но без буфера. – iain

Смежные вопросы