Ошибка в C ++ / CLI, не может получить адрес функции, если не создан экземпляр делегата с использованием Pthread - PullRequest
1 голос
/ 31 марта 2012

Я использую C ++ / CLI в Visual C ++ 2008 Professional, и поскольку я использую Windows Forms, это означает, что у меня есть управляемый код, и я пытаюсь вызвать статическую функцию LoginAccounts, но я получаю ошибку, вероятно, потому что яЯ смешиваю Managed с неуправляемым кодом, но я не могу понять, что делать, хотя.Я использую PThread для Windows

System::Void testing_Click(System::Object^  sender, System::EventArgs^  e) {
    pthread_create(&t, NULL, &Contas::LoginAccounts, this); //Error in this line
}

Ошибка 13 Ошибка C3374: невозможно получить адрес «Tester :: Test :: LoginAccounts», если не создается экземпляр делегата

что мне сделать, чтобы решить эту проблему?Вероятно, это простое решение, но я не могу понять.Заранее спасибо.

 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();
        }

Ответы [ 2 ]

5 голосов
/ 31 марта 2012

Нет смысла использовать pthreads, если все, что вам нужно, это вызвать управляемый код. Вместо этого используйте класс System :: Threading :: Thread. Вам все еще нужно создать делегата, на который жалуется сообщение об ошибке, делегаты являются управляемым эквивалентом указателя функции. При включенных колоколах они не только сохраняют адрес функции, но и переносят указатель на объект. Сделайте код похожим на это:

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();
    }

Обратите внимание, что LoginAccounts () является здесь методом экземпляра, не нужно использовать hokeypokey со ссылкой this .

Если вы действительно хотите использовать pthreads, используйте Marshal :: GetFunctionPointerForDelegate (), чтобы преобразовать делегат в указатель, который вы можете передать в собственный код. Остерегайтесь, вы должны сохранять ссылку на объект делегата самостоятельно. Сборщик мусора не может видеть ссылки, хранящиеся в собственном коде. И вы все еще не можете передать это без закрепления. Это очень уродливые детали, которых вы можете избежать, просто взамен используя класс Thread.

0 голосов
/ 31 марта 2012

См. Мой ответ на ваш другой вопрос на Вызов PThread из класса Windows Form для функции внутри класса Windows Form Вы можете использовать тот же принцип, подробно описанный там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...