2009-10-30 6 views
0

내 프로그램은 내가 원하는 것보다 훨씬 많은 CPU 시간을 소비합니다 (2 개의 디스플레이는 최대 80-90 %까지 슛합니다). Qtimers를 사용하고 있으며 그 중 일부는 2ms 정도입니다. 어떤 주어진 시간에, 나는 디스플레이 당 12+ 타이머를 가질 수 있습니다 - 2ms, 2ms, 2ms, 250ms, 나머지는 200ms와 500ms 사이입니다. 이 중 일부 또는 전부 (특히 짧은 것들)에 스레드를 사용하면 더 좋을까요? 그것이 다름을 많이 줄까요?QTimer 대 개별 스레드

+0

타이머가 쓰레드를 기다리는 중입니까? 스레드를 활성 상태로 유지하는 다른 방법이있을 수 있습니다. – bua

+0

bua : 글쎄, 나는 쓰레드를 직접 사용하지 않고있다. Qt가 장면 뒤에서 Qt를 사용한다면, 나는 그것을 알지 못합니다. 나는 단순히 주 스레드에서 하나의 루프를 실행하고 거기서 모든 스케줄링을 수행했다는 인상을 받았다. – Scott

+0

메인 스레드와 관련하여 올바른 인상을주었습니다. 타이머 중 일부를 취소하여 시간이 많이 걸리는 아이디어를 얻을 수 있습니까? 시간이 많이 걸리는 타이머 나 간격의 양이라고 생각하지 않습니다. 시간이 많이 걸리는 경우가 많습니다. –

답변

2

주된 시간 문제는 우선 순위가 높은 타이머에서 발생합니다. 먼저 QM 클래스의 오버 헤드를 극복하기 위해 매 2ms마다이 코드가 필요하다는 것을 확인하십시오. 3 초의 시간 제한을 하나로 그룹화 할 수 있으며 매번 코드 섹션을 순차적으로 실행합니다. 나는 스레딩이 문제를 해결할 것이라고 생각하지 않습니다.

+0

음,이 짧은 타이머 속도는 19200 전송 속도에서 RS-232 전송 속도를 기반으로합니다. 읽기 용 타이머 하나, 쓰기 용 타이머 한 개, 버퍼 검사 용 타이머 한 개. 250ms 타이머는 응답 타임 아웃을위한 것입니다 (디스플레이는 그 시간 내에 응답해야합니다). 나머지 타이머는 표시 텍스트 또는 일부 다른 조작을 갱신합니다. 나는 확실히 3 개의 타이머를 하나로 결합 할 수있다. – Scott

+3

아, 그럼 당연하지. 미안하지만, 당신의 질문은 정말로 "지금 네일을 넣기 위해 필립스 드라이버가 필요합니까?"와 같이 보입니다. 아니, 망치가 필요해. 이 경우에는 인터럽트 구동 I/O가 필요할 것입니다. Qt 직렬 클래스가'QIODevice :: readyRead'를 지원합니까? – MSalters

1

2ms 솔기가 나를 의심합니다. 사람들은 CPU에 과부하가 걸리지 않고 수년간 직렬 포트에 19200 보 (예 : 486 하드웨어)를 읽고 쓰고 있습니다. 어쩌면 당신의 접근 방식이 잘못되었을 수도 있습니다.

포트에 액세스하는 데 사용하는 API는 무엇입니까? api가 블로킹을 지원하면이 메소드가 훨씬 더 나은 접근 방법이 될 것입니다.

가장 간단한 방법은 독자 스레드에서 읽고 쓰는 것입니다. 루프에서 블로킹 읽기를 사용하면 스레드가 읽을 데이터가 있고 처리중인 경우에만 스레드가 사용 중입니다. 응용 프로그램은 쓰기가 필요한 시점을 알아야하므로 올바른 스레드가 조건 변수를 기다려야 할 때 데이터를 사용할 수있을 때이 조건이 쓰기 쓰레드를 깨우기 시작합니다.

직렬 포트 (예 : x 모뎀)에서 읽고 쓰는 첫 번째 응용 프로그램이 멀티 스레드가 아닌 것은 확실하지만 아마도 문서화되어 있어야합니다. 당신이 사용하고있는 API.

+0

486? 나는 그것을 4.77 Mhz 8086에서 사용했다. 그것은 나의 PC가 16 바이트 버퍼를 가진 16550A UART를 가지고있는 것을 도왔다; 19200 보오는 초당 약 2000 바이트입니다. 따라서 8 밀리 초마다 버퍼를 비울 필요가 있습니다. 인터럽트 구동 방식이므로 멋진 타이머가 필요하지 않습니다. – MSalters

+0

나는 내 486을 얻을 때까지 16550A를 얻지 못했고, 내 386SX는 16550, 같은 속도를 가졌지 만 버퍼는 없었다. – iain