windows - Fejl i C ++/CLI, Kan ikke tage adresse til funktion, medmindre du opretter delegeret eksempel ved hjælp af Pthread

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger C ++/CLI på Visual C ++ 2008 Professional, og da jeg bruger Windows Forms, betyder det, at jeg har formået at kode og jeg forsøger at kalde den statiske funktion LoginAccounts, men jeg får en fejl, sandsynligvis fordi jeg blander Administreret med ustyret kode, men jeg kan ikke finde ud af hvad jeg skal gøre. Jeg bruger PThread til Windows


System::Void testing\_Click(System::Object^  sender, System::EventArgs^  e) {
    pthread\_create(&t, NULL, &Contas::LoginAccounts, this); //Error in this line
}



  Fejl 13 fejl C3374: kan ikke tage adresse på 'Tester :: Test :: LoginAccounts', medmindre der oprettes delegerede instans



hvad skal jeg gøre for at løse dette?
Det er nok en simpel løsning, men jeg kan ikke regne ud.
Tak på forhånd.


 void LoginAccounts(){
    this->btn\_next->Enabled = false;
    this->login\_accounts->Enabled = false; //Unhandled exception here
     if(this->clb\_contas->CheckedItems->Count <= 0){ //Unhandled exception here
         } 

}

System::Void testing\_Click(System::Object^  sender, System::EventArgs^  e) {
    ThreadStart^ start = gcnew ThreadStart(this, &Login::LoginAccounts);
                Thread^ t = gcnew Thread(start);
                t->Start();
        }

Bedste reference


Der er bare ingen mening om at bruge pthreads, hvis alt du ønsker at gøre er at ringe til administreret kode. Brug stedet :: System :: Threading :: Trådklasse. Du skal stadig oprette den delegerede, som fejlmeddelelsen klager over, delegerede er de styret ækvivalent med en funktionspeger. Med klokker på lagrer de ikke bare funktionsadressen, men pakker også objektpegeren. Få koden til at ligne dette:


using namespace System::Threading;
...
private: 
    void LoginAccounts() {
        // etc...
    }
    System::Void testing\_Click(System::Object^  sender, System::EventArgs^  e) {
        ThreadStart^ start = gcnew ThreadStart(this, &Form1::LoginAccounts);
        Thread^ t = gcnew Thread(start);
        t->Start();
    }


Bemærk, hvordan LoginAccounts () er en instansmetode her, behøver ikke at gøre hokeypokey med referencen denne .


Hvis du virkelig virkelig vil bruge pthreads, så brug Marshal :: GetFunctionPointerForDelegate () for at konvertere delegaten til en peger, som du kan overføre til indbygget kode. Pas på, du skal holde delegatobjektet henvist til dig selv. Affaldssamleren kan ikke se referencer indeholdt af indbyggerkoden. Og du kan stadig ikke dette uden pinning. Disse er meget grimme detaljer, som du kan undgå ved blot at bruge Thread-klassen i stedet.

Andre referencer 1


Se mit svar på dit andet spørgsmål ved Calling PThread fra Windows Form Class til en funktion inde i Windows Form Class Du kan bruge det samme princip der er detaljeret der.