[解決済み] なぜPyQtは情報なしでクラッシュするのですか?(終了コード 0xC0000409)
質問
PyQtでソフトウェアを開発しようとしているのですが、デバッグ情報がないままソフトウェアがクラッシュしてしまうことがよくあります(終了コード0xC0000409のみ)。QThreadを使っているのですが、このようなシステムを書いてみました。
class serialThreadC(QThread):
updateOutBox = QtCore.pyqtSignal(str)
updateStatus = QtCore.pyqtSignal(int)
def __init__(self):
super(serialThreadC, self).__init__()
self.ser = False
self.state = 0
self.serialEnabled = False
def run(self):
while True:
if self.state == -3 or self.state == -2:
if self.SerialEnabled:
self.updatePB(20)
elif self.state == 0:
if self.serialEnabled:
self.updatePB(20)
def ConnDisconn(self):
self.serialEnabled = not self.serialEnabled
def updatePB(self, stat):
self.state = stat
self.updateStatus.emit(self.state)
serialThread = serialThreadC()
serialThread.start()
## sw is a QDialog already loaded
serialThread.updateOutBox.connect(sw.updateOutBox)
serialThread.updateStatus.connect(sw.updateStatus)
sw.PB_ConnDisconn.clicked.connect(serialThread.ConnDisconn)
を読み書きの際にクラッシュします。
serialEnabled
で
run()
または
ConnDisconn()
. PyQtがスレッドセーフではないこと、変数の取り扱いを間違えると私のようなタイプのクラッシュが発生することは知っていますが、私のコードのどこが問題なのかがわかりません。私の考えは(多分間違っていますが)、すべての
serialThread
メソッドは同じスレッドで実行され、GUI(メインスレッド)に接続されている場合も同様です。これは間違っているのでしょうか?同じように、私はイベントを
serialThread
で、GUIに接続したのですが、それで問題が発生したことはありません。
私が犯したミスがわかりますか?他の情報なしでクラッシュがある場合、コードをデバッグする方法はありますか?(私はPyCharm 2017.1.3を使用しています)。
どのように解決するのですか?
PyQtは、Qtがスレッドセーフであるのと同じ程度までスレッドセーフです。Qtのドキュメントには、彼らのAPIのどの部分がそうであることが保証されているか、そしてどのような状況下でそうなるかが記載されています。
クロススレッドシグナルはスレッドセーフです。
updatePB
メソッドを使用することは問題ありません。あなたの
ConnDisconn
メソッドはスレッドセーフではありませんが、それはPyQtやQtとは関係なく、単にあなたが書いた方法の結果です。その
serialEnabled
属性は同時に2つのスレッドから読み書きされる可能性があり、そのため動作は厳密に不定です。スレッドセーフな書き方としては
ミュートス
というように。
class serialThreadC(QThread):
updateOutBox = QtCore.pyqtSignal(str)
updateStatus = QtCore.pyqtSignal(int)
def __init__(self):
super(serialThreadC, self).__init__()
self.ser = False
self.state = 0
self._mutex = QMutex()
self.serialEnabled = False
def ConnDisconn(self):
self._mutex.lock()
self.serialEnabled = not self.serialEnabled
self._mutex.unlock()
def run(self):
while True:
if self.state == -3 or self.state == -2:
self._mutex.lock()
if self.serialEnabled:
self.updatePB(20)
self._mutex.unlock()
elif self.state == 0:
self._mutex.lock()
if self.serialEnabled:
self.updatePB(20)
self._mutex.unlock()
(注:何らかのIDEやデバッガを使用していて、予期せぬエラーやクラッシュが発生した場合、問題を診断する最初のステップは常に標準的なコンソールでコードをテストすることです。IDEやデバッガ自体が問題の原因であったり、PythonやQtのような基礎的なライブラリから来るエラーメッセージを隠してしまうことがよくあります)。
関連
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み] と'is'のどちらかを使って文字列を比較すると、異なる結果になることがあるのはなぜですか?
-
[解決済み] なぜPythonのコードは関数の中でより速く実行されるのですか?
-
[解決済み] Pythonの終了コマンド - なぜこんなにたくさんあるのか、そしてそれぞれはいつ使うべきなのか?
-
[解決済み] なぜdatetime.datetime.utcnow()はタイムゾーン情報を含んでいないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PicgoのイメージベッドツールをPythonで実装する
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
Pythonの@decoratorsについてまとめてみました。
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】Flaskのテンプレートが見つからない【重複あり