QThread i dostęp do obiektów z poza wątku

0

Witam, Jak to się robi w Pythonie bo pytam G. i nie rozumiem odpowiedzi :(

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

lass YourThreadName(QThread):
    def __init__(self):
        QThread.__init__(self)
    def __del__(self):
        self.wait()
    def run(self):
        print("Wątek działa")
        for i in range(0,10):
            print(i)
            self.sleep(1)


i zamiast print(i) chciałbym np. manipulować elementami interface

0

Chyba to rozgryzłem

class 4programmers_net(QThread):
    load = pyqtSignal(str);    

    def __init__(self, web):
        QThread.__init__(self)
        self.web=web
        self.load.connect(web.load)       

    def __del__(self):
        self.wait()

    def run(self):
        print("Wątek 4programmers.netl działa")
        self.sleep(1)
        self.load.emit("https://4programmers.net")        

Teraz następny problem, chciałbym dostawać wyniki(return) z metod uruchamianych poza wątkiem 4programmers_net , Jak to się robi w Pythonie ??

Prawdopodobnie będzie to coś z użyciem pyqtSlot()

1

Prawdopodobnie poszukujesz funkcji wbudowanej yield.
Na przykład:

>>> def do_some():
...     for i in range(10):
...             yield i
>>> print(do_some)
<function do_some at 0x7f73da4f8e18>
>>> for some in do_some():
...     print(some)
0
1
2
3
4
5
6
7
8
9

Oczywiście wyniki pozwoli ci jakoś filtrować. Jeśli chodziło ci o coś innego to napisz :).
(Jeśli chcesz wyniki po zakończeniu pracy wątku zamiast w trakcie, to zamiast yield, użyj return, które także przerywa działanie funkcji :).

0

Dziękuje :)
To zaskakujące ale na części metod da się po prostu wywołać funkcję z return czy z generatorem ale na innych dostaje to coś takiego :

Received signal 11 SEGV_MAPERR 000000000000
#0 0x7f71371b60a5 <unknown>
#1 0x7f7135ef7141 <unknown>
#2 0x7f71371b643d <unknown>
#3 0x7f7145a340c0 <unknown>
#4 0x7f713654ed50 <unknown>
#5 0x7f7136551f51 <unknown>
#6 0x7f713655228f <unknown>
#7 0x7f7135f69723 QtWebEngineCore::WebContentsAdapter::load()
#8 0x7f7135f69bfe QtWebEngineCore::WebContentsAdapter::load()
#9 0x7f713c0f654f meth_QWebEngineView_load
#10 0x56061318b6df <unknown>
#11 0x56061314b6e9 <unknown>
#12 0x5606131507bf <unknown>
#13 0x56061314c4c9 <unknown>
#14 0x5606131510df <unknown>
#15 0x56061318d5d3 <unknown>
#16 0x5606131d4647 <unknown>
#17 0x5606130f494e <unknown>
#18 0x5606131d4647 <unknown>
#19 0x560613187e30 <unknown>
#20 0x7f713ce163dd call_method
#21 0x7f713ce164c2 sip_api_call_procedure_method
#22 0x7f713cae1a23 sipQThread::run()
#23 0x7f7142b5761c <unknown>
#24 0x7f7145a2a494 start_thread
#25 0x7f7144c03acf clone
  r8: 0000000000000003  r9: 00007f713bd8aea0 r10: 0000000000000004 r11: 00007f70cf268ae0
 r12: 0000560614a8f330 r13: 00000000ffffffff r14: 0000000000000001 r15: 00007f70cf268af0
  di: 0000000000000070  si: 0000000000000001  bp: 00007f70cf268a80  bx: 0000560614a8f330
  dx: 00007f70a8003160  ax: 0000000000000000  cx: 0000000000000000  sp: 00007f70cf268a40
  ip: 00007f713654ed50 efl: 0000000000010202 cgf: 002b000000000033 erf: 0000000000000004
 trp: 000000000000000e msk: 0000000000000004 cr2: 0000000000000000
[end of stack trace]
Calling _exit(1). Core file will not be generated.

Process finished with exit code 1

1 użytkowników online, w tym zalogowanych: 0, gości: 1