QThread, Bluez, server_sock.accept blocking
2018-06-27T12:43:21+02:00
2018-06-27T15:22:52+02:00
2022-07-19T03:21:07+02:00
Azim04
Sziasztok!
(QThread, Bluez, server_sock.accept() megakasztja a teljes futás)

A problémám hogy a fent emlegetett  (client_sock, client_info = server_sock.accept()) várakozás a kliens csatlakozásra teljesen blokkolja a programomat, mind annak ellenére hogy a BT-al foglalkozó részt QTread-be raktam. "Csak" sima blokkolás van, a BT-hez tudok csatlakozni, adatot küldeni és fogadni. Olyan mintha csak egy egyszálú program lenne. Mit rontottam el? Vagy hogyan lehetne ténylegesen több szálat használni (pyqt5 -öt használok, és ez az első eset hogy a thread nem megfelően műkögik)

class BtServer: def __init__(self): self.bw = self.BackgroundWorker() self.bw.run() class BackgroundWorker(QtCore.QThread): kill = False def __del__(self): self.kill = True self.wait() def run(self): uuid = settings.default.uuid server_sock = BluetoothSocket(RFCOMM) server_sock.bind(("", PORT_ANY)) server_sock.listen(1) port = server_sock.getsockname()[1] advertise_service(server_sock, "alma", service_id = uuid, service_classes = [uuid, SERIAL_PORT_CLASS], profiles = [SERIAL_PORT_PROFILE], ) print("Waiting for connection on RFCOMM channel %d" % port) while not self.kill: client_sock, client_info = server_sock.accept() print("Accepted connection from ", client_info) try: c = 0 while not self.kill: data = client_sock.recv(1024) if len(data) == 0: break c += 1 print("received [%s]" % data) client_sock.send(str(c) + " - " + data.strip()) except IOError: pass print("disconnected") client_sock.close() server_sock.close() print("all done\r\n---------------\r\n")

Hívás:

from PyQt5 import QtWidgets, uic, QtGui, QtCore ... class MainWindow(QtWidgets.QMainWindow): def __init__(self): .... if settings.default.bluetooth: self.bts = BtServer()
Mutasd a teljes hozzászólást!
A doksi szerint a QThread-et a start() metódusával lehet indítani. Ha a run() metódust hívod meg kézzel, az csak egy mezei metódushívás lesz, ugyanazon a szálon. (A start() indít egy új szálat, és azon hívja meg a run()-t.)
Mutasd a teljes hozzászólást!

abcd