Wie per CreateThread einer Funktion mehr als 1 Parameter übergeben?



  • Moin,
    wie kann ich mittels CreateThread einer Funktion mehr als 1 Parameter übergeben?
    Also so mein Funktions Header aus:

    void test(int arg1,int arg2) {
    

    Doch wie starte ich einen Thread mit 2 Argumenten?



  • Das geht nicht.



  • den einen möglichen parameter benutzen und einen zeiger auf eine struct übergeben 🙂



  • sothis_ schrieb:

    den einen möglichen parameter benutzen und einen zeiger auf eine struct übergeben 🙂

    nö wäre cheaten



  • orz schrieb:

    sothis_ schrieb:

    den einen möglichen parameter benutzen und einen zeiger auf eine struct übergeben 🙂

    nö wäre cheaten

    👍



  • struct bla
    {
    	int arg1;
    	int arg2;
    }
    
    void test(int arg1, int arg2)
    {
    	int i = arg1 + arg2;
    }
    
    DWORD ThreadProc(LPVOID lpParameter)
    {
    	bla *p = reinterpret_cast<bla*>(lpParameter);
    	test(p->arg1, p->arg2);
    
    	return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	DWORD dwThreadId;
    	bla *p = new bla;
    	p->arg1 = 5;
    	p->arg2 = 10;
    	CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, p, NULL, &dwThreadId);
    	return 0;
    }
    


  • delete nicht vergessen!



  • das mit dem delete ist aber so ne sache..^^

    du kannst das delete nicht in der thread funktion aufrufen, weil der speicher ja in einem anderen thread allokiert wurde..

    also musst du in der funktion die den thread startet warten bis die thread funktion beendet wurde, und dann kannst du den speicher wieder freigeben..

    oder du musst dir was anderes überlegen.. 😉 zb mit HeapCreate nen eigenen heap erstellen..



  • DWORD test(int arg1, int arg2)
    {
        return arg1+arg2;
    }
    
    int main()
    {
        struct ThreadProxy
        {
            static DWORD ThreadProc(LPVOID)
            {
                return test(23, 42);
            }
        }
    
        CreateThread(0, 0, ThreadProxy::ThreadProc, 0, 0, 0);
    }
    

    Aus dem Handgelenk, deshalb völlig ungetestet.
    Eventuell auch zu beachten: http://blog.m-ri.de/index.php/2007/11/28/createthread-und-die-crt/


  • Mod

    arnold72 schrieb:

    das mit dem delete ist aber so ne sache..^^
    du kannst das delete nicht in der thread funktion aufrufen, weil der speicher ja in einem anderen thread allokiert wurde..

    Quark. Man kann delete aus jedem Thread aufrufen egal wo der Speicher in diesem Prozess allokiert wurde.

    arnold72 schrieb:

    also musst du in der funktion die den thread startet warten bis die thread funktion beendet wurde, und dann kannst du den speicher wieder freigeben..
    oder du musst dir was anderes überlegen.. 😉 zb mit HeapCreate nen eigenen heap erstellen..

    Nö!



  • arnold72 schrieb:

    das mit dem delete ist aber so ne sache..^^

    du kannst das delete nicht in der thread funktion aufrufen, weil der speicher ja in einem anderen thread allokiert wurde..

    also musst du in der funktion die den thread startet warten bis die thread funktion beendet wurde, und dann kannst du den speicher wieder freigeben..

    oder du musst dir was anderes überlegen.. 😉 zb mit HeapCreate nen eigenen heap erstellen..

    Man könnte ...
    die Struktur lokal in der main-Funktion anlegen
    die Struktur global anlegen
    die Struktur auf dem Heap allokieren und ein Event (global oder als Member der Struktur) anlegen, welches vom Thread signalisiert wird, nachdem im Thread die Daten in eine lokale Variable kopiert worden sind und in der threadstartenden Funktion auf dieses Event warten, dann delete ausführen

    Aber trotz alledem kann man der Threadfunktion nach wie vor nur einen Parameter übergeben.


Anmelden zum Antworten