Qt에서 QTcpsocket으로 TCP통신을 할때 Thread관련 질문입니다.

kjhkjh724의 이미지

QTcpsocket에서 입력받은 데이터를 읽을때 readyread() signal을 이용해서 하고 있는대 이때 QTcpsocket이 작동되는(?)Thread는 main Thread인가요?
또 데이터가 들어와서 event와 signal을 발생시키고 처리하는 Thread또한 Main Thread인가요?
readyread()를 signal로 받아 처리하게 되는 slot이 작동하는 Thread 또한 Main Thread인가요?

현제 제가 알기론 QThread를 서브클래싱하여 run()함수를 재정의 하여 run()함수 내부가 멀티 쓰레드가 되는걸로 알고있는대 그럼 그왜의 부분들은 전부 MAIN에서 돌아가나요?

shint의 이미지


- 스레드 갯수를 확인하기 어려우시면. 하나씩 코드를 지워보세요.
윈도우는 작업관리자'에서 스레드 갯수. GDI 갯수. HANDLE 갯수'를 확인하실 수 있습니다.

리눅스라면... 이런거로 확인 되는지 모르겠네요.
ps -aux
top

//리눅스 스레드 갯수'로 찾아보니. 여기서 확인 가능하다고 합니다.
http://raphaell.egloos.com/967138
cat /proc/1203/status

//------------------------------------------
Signal Thread Qt
http://www.google.co.kr/search?q=Signal+Thread+Qt&hl=ko&biw=&bih=&gbv=2&oq=Signal+Thread+Qt&gs_l=heirloom-serp.3..0i30j0i5i10i30j0i8i30l8.82152.83245.0.83611.3.3.0.0.0.0.204.531.0j2j1.3.0....0...1ac.1.34.heirloom-serp..0.3.530.dWFfBEfuRnI

Threads and QObjects
http://doc.qt.io/qt-4.8/threads-qobject.html

Per-Thread Event Loop
Signals and Slots Across Threads

[QT/X11] QThread에서 signal전달하기 예제
http://korone.net/bbs/board.php?bo_table=qt_lecture&wr_id=568

[SOLVED] Signals, slots and threads misunderstanding - help needed
http://www.qtforum.org/article/37881/solved-signals-slots-and-threads-misunderstanding-help-needed.html

How To Really, Truly Use QThreads; The Full Explanation
https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/
http://www.mayaposch.com/

//------------------------------------------
How to emit cross-thread signal in Qt?
http://stackoverflow.com/questions/638251/how-to-emit-cross-thread-signal-in-qt

//--------------------------------------------------------
QTcpSocket Chat : Mutiple Client using FD_SET and select()
http://www.qtcentre.org/threads/9157-QTcpSocket-Chat-Mutiple-Client-using-FD_SET-and-select()

QThreadPool
http://www.bogotobogo.com/Qt/Qt5_QTcpServer_QThreadPool_Multithreaded_Client_Server.php

C++ GUI Programming with Qt4: Networking
http://www.informit.com/articles/article.aspx?p=1405552&seqNum=3

Fortune Client Example
http://doc.qt.io/qt-5/qtnetwork-fortuneclient-example.html

Threaded Fortune Server Example
http://doc.qt.io/qt-5/qtnetwork-threadedfortuneserver-example.html

QTcpSocket Class
http://doc.qt.io/qt-5/qtcpsocket.html

QTcpSocket: reading and writing
http://stackoverflow.com/questions/20546750/qtcpsocket-reading-and-writing

Qt5 Tutorial QTcpSocket with Signals and Slot
http://www.bogotobogo.com/Qt/Qt5_QTcpSocket_Signals_Slots.php

How to make QTcpSocket wait for receiving data
http://www.codeproject.com/Questions/824352/How-to-make-QTcpSocket-wait-for-receiving-data?arn=38

Qt for WinRT
http://doc.qt.io/qt-5/winrt-support.html

[QT/Win32] QTcpSocket 사용중에
http://www.korone.net/bbs/board.php?bo_table=qt_qna&wr_id=21387&sca=QT%2FWin32&page=5

QAbstractSocket Class
http://doc.qt.io/qt-5/qabstractsocket.html

Note: The returned QTcpSocket object cannot be used from another thread.
If you want to use an incoming connection from another thread, you need to override incomingConnection().

QTcpServer Class
http://doc.qt.io/qt-5/qtcpserver.html

QNetworkAccessManager Class
http://doc.qt.io/qt-5/qnetworkaccessmanager.html

QThreadPool Class
http://doc.qt.io/qt-5/qthreadpool.html

Multithreading Technologies in Qt
http://doc.qt.io/qt-5/threads-technologies.html

Qt5 Tutorial Asynchronous QTcpServer with QThreadPool - 2015
http://www.bogotobogo.com/Qt/Qt5_Asynchronous_QTcpServer_QThreadPool.php

QTcpServer with QThreadPool, for long term connections.
https://forum.qt.io/topic/5148/qtcpserver-with-qthreadpool-for-long-term-connections

How to pass a QTcpSocket to a QRunnable in Qt 5.2
http://stackoverflow.com/questions/23812483/how-to-pass-a-qtcpsocket-to-a-qrunnable-in-qt-5-2

Qt - QTcpServer using QThreadPool (The way to go of making a server)
https://gist.github.com/lamprosg/4593408

Client-Server application using thread pool - implementation suggestions
http://www.qtcentre.org/archive/index.php/t-22699.html

C++ Qt 69 - QTcpServer using QThreadPool
https://www.youtube.com/watch?v=xm_fkZolMFA

//------------------------------------------
Signal Thread
http://www.google.co.kr/search?q=Signal+Thread&hl=ko&biw=&bih=&gbv=2&oq=Signal+Thread&gs_l=heirloom-serp.12...297902.297902.1.298270.1.1.0.0.0.0.0.0..0.0....0...1ac.1.34.heirloom-serp..1.3.530.iMdI60YRwlU

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

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

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

익명 사용자의 이미지

보통 무조건 연결당 쓰레드를 만들게 프레임워크를 만들지는 않는데요.(수십개 사례에서)
개인적으로 쓰레드 수준의 설정은 사용자가 선택하게 해주는게 정상적인 프레임워크라고 봅니다.
QT는 잊을만 하면 회자되네요.

확실하게는 소스를 보는게 맞는데. 구현이 설계서와 다른 경우도 많으니,...
소스나, 설계문서 보는게 시간이 걸린다면, 초딩시절해봤던 블랙박스 실험을 약간 해야겠네요.
맛을 보고, 냄새 맡아보고... ㅎㅎ
각설하고,
---------------------
linux 라면,
1) pthread 링크가 되었는지 검사해보고
$ ldd <실행파일명>
...
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f79f660d000) <-- 쓰레드를 쓰기는 했구나라는 정도의 의미
...

2) 적절한 위치(알고 싶은 위치)에서
pthread_self() 값(쓰레드 id)을 출력해 보고,
컴파일시 -lpthread 해서 라이브러리 링크 해주시고.

3) 쉘에서 알아보려면...(해당 프로세스의 쓰레드가 몇 개인지 알아보기),
멀티쓰레드인 경우 특정 쓰레드중 하나가 멈추는 경우(버그)가 있을 수도 있으니, 테스트 단계에서 하시면 되겠지요.
$ ps -eLf
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 1 0 1 0 1 10:07 ? 00:00:00 /sbin/init
root 2 0 2 0 1 10:07 ? 00:00:00 [kthreadd]
root 3 2 3 0 1 10:07 ? 00:00:00 [ksoftirqd/0]
...
* 위 출력에서, LWP가 쓰레드 식별자(tid)입니다.

kjhkjh724의 이미지

제가 문서의 내용을 이해한 대로라면 run()함수 내부 부분만 따로 하나의 루프를 도는 Thread이고 나머지는 호출되는 매모리 위치에 따라 다르겠지만 대부분 Main이라고 생각하면 되내요. 함수의 호출 위치가 Run내부인가 아닌가의 문제... 또한 그렇기 때문에 Run 내부에서 무언가를 생성하고 그에 연관된 부분을 외부에서 사용하면 2개가 생성되는... 예를 들면 QTcpSocket을 run 내부에서 생성한후 run()외부에서 포인터를 이용해 무언가를 하려고 하면 외부에 다시 생성되면서 Error가 발생하는군요... 제가 제대로 이해한건지 확신이 안들긴 하지만...

kjhkjh724의 이미지

http://doc.qt.io/qt-4.8/threads-qobject.html 이 문서에 관련 내용이 나와있내요.

shint의 이미지

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

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

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

댓글 달기

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