Как вы extern делегата в .Net C ++ - PullRequest
1 голос
/ 22 июня 2011

Это второй вопрос из серии, касающийся обновления пользовательского интерфейса из другого потока. Я пытаюсь использовать делегата, чтобы сказать пользовательскому интерфейсу выполнить функцию обновления (данные не нужно передавать). Я создал делегат в потоке пользовательского интерфейса и объявил его поверх потока пользовательского интерфейса:

delegate void MyDel();
public ref class Form1 : public System::Windows::Forms::Form
{
    // .....
    void testFunc()
    {
       this->local_long_textBox->Text = "Test!!!!!!!";
    }
private:
    void startUp()
    {
       MyDel^ DelInst = gcnew MyDel(this,&CotStinger::Form1::testFunc);

Я хотел бы передать DelInst другому потоку при создании, но когда я пытаюсь объявить MyDel как extern, как это поверх другого модуля:

extern delegate MyDel;

Я получаю ошибку:

Ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'MyDel'.

Если я попробую это

extern delegate void MyDel();

Я получаю ошибку:

Ошибка C2144: синтаксическая ошибка: 'void' должен предшествовать ';'

Так как же заставить другой класс распознавать тип делегата, чтобы я мог передать указатель делегата в конструктор?

1 Ответ

2 голосов
/ 22 июня 2011

Ключевое слово delegate используется для определения делегата типа , а не для объявления переменной, являющейся делегатом некоторого типа. Т.е. после определения типа делегата вам не нужно ключевое слово delegate.

Кроме того, глобальные переменные управляемых типов не разрешены в C ++ / CLI; Обычный обходной путь заключается в использовании логически-статического управляемого класса с открытыми статическими членами-данными, которые функционируют как глобальные:

delegate void MyDel();
private ref struct Globals abstract sealed
{
    static MyDel^ MyDelInstance;
};

// ...

Globals::MyDelInstance = gcnew MyDel(this, &CotStinger::Form1::testFunc);

Так как же заставить другой класс распознавать тип делегата, чтобы я мог передать указатель делегата в конструктор?

Так же, как и с любым другим типом - поместите его в заголовочный файл, чтобы оба класса могли #include.

...