[질문]QT KeyEvent 처리 질문 드립니다.

paeksj98의 이미지

안녕하세요.

QT로 만들어진 단말기 기반에서 어떤식으로 처리들을 하시는지 질문 드립니다.
질문 과정에서 제가 이해가 부족해서 이상한 내용이 있을수도 있습니다. 이해 부탁 드립니다.

질문에 요지는 위젯 기반으로 디스플레이를 해서 하위 메뉴로 계속해서 진입을 합니다.
이상태에서 ESC키로 메뉴 빠져나가기(상위 메뉴로 이동) 아주 빠르게 연속으로 누르면 문제가됩니다.

a=>b=>c=>d=>e 이런식으로 진입을 하고
e=>d=>c=>b=>a 요렇게 빠져나오게 됩니다.

문제는 빠져나올때 ESC이벤트가 발생하고 c빠져나가기 위한 처리를 하는 도중 다시 ESC가 발생하면 b의 빠져나가기 위한 처리에서 문제가 됩니다.
c가 완료 되기전에 b가 쳐리가 되면 문제가 되는 현상입니다. 이런경우를 피하기 위해서 어떻게 처리 하시는지 궁금합니다.

KeyThreadEvent *keypress = new KeyThreadEvent(QEvent::KeyPress, keycode,0,0,NULL,0,1);
pThis->receiver =  qApp->focusWidget();
qApp->postEvent(pThis->receiver, keypress);

혹시 참고할만한 테크닉이 있으면 조언 부탁드립니다.
지금 구조는 이벤트가 발생하면 바로 바로 PostEvnet로 보내서 바로 처리하게 되어있습니다.

paeksj98의 이미지

ESC키다 눌려서 e에서 d로 넘어오면서 d함수를 실행도중..
ESC키가 또 눌려서 C에서 delete d를 하는도중 d는 아직도 함수 실행을 합니다.

이런과정에서 생기는 문제데. 임의로 전함수가 완료가 안되면 접근을 하지 못하게 해야하는건지...

klara의 이미지

KeyThreadEvent가 뭔가요? 키보드 관련 이벤트를 직접 발생시켜서 처리해야하는 상황이라는 뜻이신가요?
그러니까, Qt가 자체적으로 지원하지 않는 윈도우 시스템을 이용하고 계신건가요?
그리고 왜 c가 처리되기전에 ESC가 또 눌리면 문제가 되나요? 이벤트 큐는 fifo니까 눌린 순서대로 처리하면될텐데요.
d에서 처리가 안끝났는데 어떻게 c로 넘어갈수가 있지요?

paeksj98의 이미지

QEvent를 상속 시켜서 키처리를 위한 이벤트입니다.
키값을 읽어서 강제로 키이벤트를 발생시킵니다.
임베디드 기반 리눅스를 올려서 쓰고 있습니다.
C가 처리 완료되기 전에 B를 접근하게 되면 두개가 서로 엉켜서 문제가 되네요.
강제로 이벤트를 발생시켜서 d가 처리가 끝나기 전에도 C로 넘어가네요.
d처리중 타이머 이벤트를 발생시켜서 일정시간을 대기하는데 이때 .c로 넘어가면delete로 d를 삭제하기도 하고 ...엉켜있는 부분이 너무 많네요.
시스템이 개발된지가 좀 오래되고 제가 개발한 시스템이 아니라서 헤매네요...
문제는 d가 처리가 끝날때까지 기다리는 문제가 우선 d가 완료 될때까지는 키처리를 하지 않도록 수정하였습니다.

정리차원에서 한가지만 질문드리겠습니다.
이벤트 처리가 fifo가 맞나요..??
키이벤트가 2번 발생하고 d처리도중 TimerEvent를 발생시킨다면 Fifo에 쌓여 있는 다음 처리를 하는게 맞나요..?? 당근 맞겠지요....

kldp 여러 회원님들께 항상 많이 배워갑니다.
답변 감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.