[완료]PostMessage를 LB_ADDSTRING용도로 사용할시 문제에 대해 질문 드립니다.

richjaff의 이미지

SendMessege에서 PostMessege로 바꿔서 구현해보려고 하는 중입니다.

그런데 WM_CLOSE나 LB_RESETCONTENT 를 인수로하여 실행하면 잘되는 반면,
스트링 출력과 관련해서는 FALSE리턴되는 동시에 작업이 실패하면서 출력이 안되네요.
========== MSDN 내용 ====================================
Return Value
BOOL
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
========================================================
MSDN에서 정보를 찾아본뒤 에러를 검출했더니,
에러코드:0, 에러내용: 작업이 완료되었습니다. 라고 뜨더군요.
(물론, FALSE를 리턴한 직후에 검출을 실시했습니다. 다른 쓰레드와 GetLastError 정보가 섞이지 않는 상태에서요.)

혹시 PostMessage 자체에 문제인가 싶어서 인수를 바꿔서 실행해봤는데,
다음의 코드에 대해서는 잘 작동하더군요.

PostMessage(hdwnd, WM_CLOSE, 0, 0); // 잘됨
PostMessage(hData, LB_RESETCONTENT, 0, 0); // 잘됨

그런데 아래 두개에 대해서는 유독 FALSE를 리턴하는 동시에 작업이 이루어지지 않습니다.
(물론, 버퍼는 아래처럼 static이나 동적할당해서 사용했구요.)

static char buffers[]= "1212312313";
PostMessage(hData, LB_ADDSTRING, 0, (LPARAM)(LPSTR)buffers); // FALSE 리턴하는 동시에 출력되지 않음
PostMessage(hUserlist, SB_SETTEXT, 0, (LPARAM)(LPSTR)buffers); // FALSE 리턴하는 동시에 출력되지 않음
PostMessage(hUserlist, SB_SETTEXT, 0, (LPARAM)TEXT(buffers)); // 이렇게 바꿔도 마찬가지

이때, 함수를 다시 SendMessage로 바꿔서 실행하면 잘되구요.

SendMessage(hData, LB_ADDSTRING, 0, (LPARAM)(LPSTR)buffers); // 출력됨
SendMessage(hUserlist, SB_SETTEXT, 0, (LPARAM)(LPSTR)buffers); // 출력됨

이문제에 대해 도움좀 부탁드립니다.

bugiii의 이미지

PostMessage는 쓰레드 큐에 메시지를 담기만하고 바로 리턴됩니다. 반면 SendMessage는 받는 쪽이 처리가 끝나는 것을 기다리게 됩니다. PM이 바로 리턴되면서 성공했다는 것은 큐에 담는 것을 성공했다는 것을 나타냅니다.

그리고, 질문하신 내용은 PM의 문서에서 다음과 같은 언급을 하고 있습니다.

Quote:
If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters cannot include pointers. Otherwise, the operation will fail. The functions will return before the receiving thread has had a chance to process the message and the sender will free the memory before it is used.

이것은 WM_USER 아래쪽 메시지들은 PM류로 사용할 때 포인터 타입의 인자일 경우 실패한다라는 것입니다. 이유는 예상할 수 있듯이 메모리 관련이고요. 이런 문제를 아예 일으키지 못하게 하도록 한듯합니다. 결국 그러한 형태의 메시지는 SM류를 사용해야 한다는 것입니다.

꼭 쓰레드를 넘어서 PM으로 보내는 형태여야 한다면, WM_USER 이상의 번호로 사용자 메시지를 정하고 PM으로 보낸 다음 해당 쓰레드 안에서 SM을 해보시면 제대로 될 겁니다. 이때에는 메모리 관련 문제는 잘 생각하시고요.

그런데, 지금 처한 상황이 쓰레드마다 윈도우를 따로 가지고 있고, 어떤 쓰레드가 다른 쓰레드의 윈도우에 메시지를 보내는 것입니까? 가능한 이렇게 안하는 것을 권해드립니다. 워커 쓰레드는 어떤 일을 하도록 하고 UI는 메인 쓰레드에서 담당하도록 하는 것이 여러가지 문제를 회피할 수 있다고 경험으로 알 수 있습니다.

노파심에서 한말씀 더 드리면 쓰레드를 사용하지 않을 수만 있다면, 사용하지 않는 것이 최선.

richjaff의 이미지

포인터 타입을 인자로 넘겨서 생기는 문제였군요.;
말씀하신대로 UI는 주쓰레드에서만 담당시키려고 생각중입니다.
그게 차라리 효율적일것 같네요.

이번에도 큰 도움주셔서 감사합니다. (__)

댓글 달기

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