2012-01-27 4 views
2

간단한 채팅 프로그램의 경우 boost :: python으로 감싸 인 c lib를 사용합니다.QThread 블록 차단 GUI

간단한 GUI는 PyQT를 사용하여 작성되었습니다. 메시지 수신은 lib에 대한 차단 호출을 통해 수행됩니다. GUI가 독립적으로 새로 고치려면 통신 부분이 QThread에 있습니다. 내가 GUI와 독립 될 수있는 통신을 가정 것이지만

의 GUI는 매우 응답하지 않고 메시지 만에 오는 경우 업데이트 할 것 같다.이 악명 높은 글로벌 통역 잠금에 의해 발생할 수 있습니다

#!/usr/bin/env python 

import sys 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

import pynetcom2 
import time 


class NetCom(QThread): 

    def __init__(self): 
    QThread.__init__(self) 
    self.client = pynetcom2.Client() 
    self.client.init('127.0.0.1', 4028) 
    self.client.provide('myChat', 1) 
    self.client.subscribe('myChat', 100) 

    def run(self): 
    while (1): 
     print "Waiting for message..." 
     text = self.client.recvStr('myChat', True) 
    return 



class Netchat(QMainWindow): 

    def __init__(self, argv): 

     if (len(argv) != 2): 
      print "Usage: %s <nickname>" %(argv[0]) 
      sys.exit(1) 
     self.nickname = argv[1] 
     print "Logging in with nickname '%s'" %(self.nickname) 

     super(Netchat, self).__init__() 
     self.setupUI() 

     rect = QApplication.desktop().availableGeometry() 
     self.resize(int(rect.width() * 0.3), int(rect.height() * 0.6)) 
     self.show() 

     self.com = NetCom() 
     self.com.start() 

    def setupUI(self): 
     centralWidget = QWidget() 
     self.setCentralWidget(centralWidget) 

     self.testList = QListWidget() 

     mainLayout = QHBoxLayout() 
     mainLayout.addWidget(self.testList) 
     centralWidget.setLayout(mainLayout) 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    netchat = Netchat(sys.argv) 
    app.exec_() 

답변

6

(GIL). 파이썬은 두 개의 스레드가 동시에 파이썬 코드를 실행하는 것을 허용하지 않습니다. GUI 코드를 병렬로 실행하려면 C 함수에서 명시 적으로 GIL을 해제하고 다시 획득해야합니다.

이 내용은 Python C API 설명서에서 설명합니다. Thread State and the Global Interpreter Lock.) 지금은 매력처럼 작동, 충분한 악명하지

Py_BEGIN_ALLOW_THREADS 

// Your expensive computation goes here. 

Py_END_ALLOW_THREADS 
+0

을 :

그것은 당신의 C 확장에 다음과 같은 매크로를 사용하여 아래로 비등! – joekr