MFC 스레드 잡업중에서G UI 작업은 될 수 있으면 배제하는게 맞나요?

fhdaos10의 이미지

제가 여전에 얼핏 본 기억으로 스레드 작업중에서

GUI작업은 될 수 있으면 직접적으로 하지 않는 것이 좋다라는 내용이 머릿속에 너무 강하게 각인되어있는데요...

해당 내용으로 검색을 아무리 해봐도 찾을 수가 없더군요;;;

선배개발자님들..저 말이 맞나요? 맞다면 왜 그런건가요?

shint의 이미지

Thread 스레드와 UI 를 분리하여 처리하는 방법 - 윈도우와 다이얼로그 멈춤을 방지하는 방법 | 디버깅과 테스트
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=962078&ref=962078&page=1

MFC UI Thread 스레드 통신 방법 정리 | 디버깅과 테스트
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=960863&ref=960863&page=1

UI 와 멀티 스레드 처리방법 - MFC | 디버깅과 테스트
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=953539&ref=953539&page=1

찾아보니. 데브피아'에 여러가지 강좌가 많이 있네요. 추가해봅니다.

이미 생성된 COM Pointer를 다른 Thread에서 사용하기 | ActiveX/COM
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8609&page=8

워커 쓰레드 관리 클래스 | VC++ 일반
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8600&page=9

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

drinkme의 이미지

뭐 나름이겠지만,
항상 절대적 금지는 아닙니다.

보통 그렇게 안하죠. 금기사항처럼 얘기되기도 하고요.

Necromancer의 이미지

MFC 아니더라도 다 적용되는 사안입니다.

멀티스레드 GUI 프로그램일 경우 GUI 출력을 전담하는 스레드를 따로 둬서 이 스레드에서만 GUI 입출력을 하고 다른 스레드에서 GUI 출력이 필요하면 직접 GUI API 호출이 아닌 GUI출력 전담스레드에 출력을 요청하는 방식으로 구현하라는 겁니다.

GUI 출력스레드는 작업스레드에서 출력요청이 오면 현재 호출중인 GUI 함수들과 순서아 꼬이지 않도록 정리해서 호출하거나 다른 출력작업이 있어 출력해서는 안되는 상황일 경우 기다렸다가 출력해주거나 굳이 그때 말고는 출력이 필요없는 경우 버립니다.

GUI 관련 함수들이 thread-unsafe하게 된 경우가 많고, thread-safe하더라도 네트웍 연결로 나올때 순서 꼬이거나 해서 문제 생기는 경우가 많습니다. GUI 함수 중에는 중간에 간섭 없이 순서대로 호출해야 하거나 쌍이 맞아야 하는 경우도 있습니다.

X윈도우 프로그램도 X Connection 하나를 여러스레드에서 공유하면서 동시에 Xlib 호출하다보면 아주 랜덤하게 Bad Error내면서 프로그램이 뻗습니다. 아무생각없이 짜깁기로 프로그램 짰다면 메모리 누수처럼 원인 찾기도 매우 힘듭니다.

보통은 프로그램의 메인 스레드가 GUI(+간단한 작업)를 전담하고, 메인스레드에서 만들어진 작업 스레드는 주어진 일만 하는 식으로 구현합니다.

Written By the Black Knight of Destruction

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.