IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: .NET ekvivalent pro moveToThread z Qt C++ frameworku?

Aktivity
Avatar
Erik Šťastný:22.2.2017 16:45

Zdravím,

rád bych se zeptal zda má .NET nějaký ekvivalent k výše zmíněnému?

jde prakticky o to, že v Qt můžete vytvořit jakoukoliv vlastní třídu, stačí aby podědila z QObjectu a následně má metodu MoveToThread, která dělá to, že celá třídá slouží jako eventová smyčka v jiném vlákně a následně používáte signály a sloty pro komunikaci mezi vlákny, je nějaký ekvivalent v C# pro tohle?

Popis z dokumentace zde: Qt Doc

Editováno 22.2.2017 16:45
 
Odpovědět
22.2.2017 16:45
Avatar
Erik Šťastný:24.2.2017 11:39

bump :-`

 
Nahoru Odpovědět
24.2.2017 11:39
Avatar
Erik Šťastný:24.2.2017 11:54

Zde bych rád dodal funkční příklad, který používám v Qt frameworku přes Python pro který hledám .NET ekvivalent.

from PyQt5.QtCore import *


class Main():
    SignalToSlot1 = pyqtSignal()
    SignalToSlot2 = pyqtSignal()

    def __init__(self):
        self.InitThread()

    def initTreading(self):

        self.Thread = QThread()
        self.Thread.start()

        self.Worker = Worker()
        self.Worker.moveToThread(self.Thread)

        self.Worker.SignalFromThreadOK.connect(self.event_from_threadOK)
        self.Worker.SignalFromThreadNOK.connect(self.event_from_threadNOK)

        self.SignalToThread.connect(self.Worker.slot1)
        self.SignalToThread.connect(self.Worker.slot2)

    def execute_slot1_in_thread(self):

        self.SignalToSlot1.emit()

    def execute_slot2_in_thread(self):

        self.SignalToSlot2.emit()

    def event_from_threadOK(self, text):
        print ("Slot01 in another thread finished with OK")

    def event_from_threadNOK(self, text):
        print ("Slot01 in another thread finished with NOK")


class Worker(QObject):
    SignalFromThreadOK = pyqtSignal(str)
    SignalFromThreadNOK = pyqtSignal(str)

    def __init__(self):
       super().__init__()

    def slot1(self):
        time.sleep(5)
        #Working
        if Working == OK:
            SignalFromThreadOK.emit("Slot01 OK")
        else:
            SignalFromThreadNOK.emit("Slot01 NOK")

    def slot2(self):
        time.sleep(5)
        #Working
        if Working == OK:
            SignalFromThreadOK.emit("Slot02 OK")
        else:
            SignalFromThreadNOK.emit("Slot02 NOK")
Editováno 24.2.2017 11:55
 
Nahoru Odpovědět
24.2.2017 11:54
Avatar
Erik Šťastný:24.2.2017 12:11

Tak ještě jednou plně funkční opravený příklad ...

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

class Main(QWidget):
    SignalToSlot1 = pyqtSignal()
    SignalToSlot2 = pyqtSignal()

    def __init__(self):
        super().__init__()
        self.initTreading()

    def initTreading(self):

        self.Thread = QThread()
        self.Thread.start()

        self.Worker = Worker()
        self.Worker.moveToThread(self.Thread)

        self.Worker.SignalFromThreadOK.connect(self.event_from_threadOK)
        self.Worker.SignalFromThreadNOK.connect(self.event_from_threadNOK)

        self.SignalToSlot1.connect(self.Worker.slot1)
        self.SignalToSlot2.connect(self.Worker.slot2)

    def execute_slot1_in_thread(self):

        self.SignalToSlot1.emit()

    def execute_slot2_in_thread(self):

        self.SignalToSlot2.emit()

    def event_from_threadOK(self, text):
        print ("Slot01 in another thread finished with OK")

    def event_from_threadNOK(self, text):
        print ("Slot01 in another thread finished with NOK")


class Worker(QObject):
    SignalFromThreadOK = pyqtSignal(str)
    SignalFromThreadNOK = pyqtSignal(str)

    def slot1(self):
        time.sleep(5)
        #Working
        if Working == OK:
            SignalFromThreadOK.emit("Slot01 OK")
        else:
            SignalFromThreadNOK.emit("Slot01 NOK")

    def slot2(self):
        time.sleep(5)
        #Working
        if Working == OK:
            SignalFromThreadOK.emit("Slot02 OK")
        else:
            SignalFromThreadNOK.emit("Slot02 NOK")

def main():
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

main()
Editováno 24.2.2017 12:11
 
Nahoru Odpovědět
24.2.2017 12:11
Avatar
Odpovídá na Erik Šťastný
sadlomaslox25:25.2.2017 15:59

z ukazky me neni jasne k cemu takova metoda je ale nejspis hledas nejakou synchronizaci mezi vlakny? https://msdn.microsoft.com/…vs.110).aspx

 
Nahoru Odpovědět
25.2.2017 15:59
Avatar
Odpovídá na sadlomaslox25
Erik Šťastný:27.2.2017 9:32

No na to abych mohl pustit operaci co trvá třeba 5 vteřin a nezasekl hlavní vlákno, ale hnedka po dokončení dostal do hlavního vlákna info že operace skončila dobře nebo špatně.

 
Nahoru Odpovědět
27.2.2017 9:32
Avatar
Odpovídá na Erik Šťastný
Michal Štěpánek:27.2.2017 10:48

BackgroundWorker ti jednoduše pomůže...

Nahoru Odpovědět
27.2.2017 10:48
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Erik Šťastný:27.2.2017 10:55

BackgroundWorker, Task, nový Thread, myslím, že v mém případě v tom nevidím rozdíl, já spíše netuším jak se implementují vlastní eventy.

Nejspíše něco takového: C# Events between threads

Jen si trošku nevím rady s tou implementací

 
Nahoru Odpovědět
27.2.2017 10:55
Avatar
Odpovídá na Erik Šťastný
Michal Štěpánek:27.2.2017 10:57

Z <a href="https:/­/channel9.msdn­.com/Blogs/Jan­Steberl/Pouzi­ti-BackgroundWorker-ve-WinForms-aplikacich-CZ">tohoto videa</a> jsem to pochopil i já...

Nahoru Odpovědět
27.2.2017 10:57
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.