Проблема обращения к компоненту из функции
От: skiner.dp  
Дата: 30.01.08 21:57
Оценка:
P.S.:недавно токо начал учить C++.net
Ну в общем сделал, что при нажатии на кнопку идёт обращение к статической функции, или просто к функции, ну там что-то выполняет и должна ответ вывести в listBox. Токо вот проблема в функции watcher_Changed компонента textBox1 просто не видно(у меня одна форма). Как и где объявить что бы было видно компонент из функции и можно было к нему обращаться????

Привожу код!!

 private: System::Void button2_Click_2(System::Object^  sender, System::EventArgs^  e)
          {
              ...
              watcher->Deleted += gcnew FileSystemEventHandler(watcher_Changed); //обращаемся к функции watcher_Changed
              watcher->EnableRaisingEvents = true;
              ...        
          }
 //вот эта функция
  static void watcher_Changed(Object^  sender, FileSystemEventArgs^  e)
 {
           ...
           textBox1->Text = "Hello"; //хотим вывести "Hello"в listBox1
           ...             
              
 }


Заранее спасибо!
Re: Проблема обращения к компоненту из функции
От: pvnic  
Дата: 31.01.08 06:33
Оценка:
Здравствуйте, skiner.dp, Вы писали:

static убери...
Re: Проблема обращения к компоненту из функции
От: Alexey M.  
Дата: 31.01.08 09:50
Оценка:
Здравствуйте, skiner.dp, Вы писали:

SD>P.S.:недавно токо начал учить C++.net

SD>Ну в общем сделал, что при нажатии на кнопку идёт обращение к статической функции, или просто к функции, ну там что-то выполняет и должна ответ вывести в listBox. Токо вот проблема в функции watcher_Changed компонента textBox1 просто не видно(у меня одна форма). Как и где объявить что бы было видно компонент из функции и можно было к нему обращаться????

SD>Привожу код!!


...поскипано...

Вот так будет работать:


private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
 {
    watcher->Deleted += gcnew FileSystemEventHandler(this, &Form1::watcher_Changed); //обращаемся к функции watcher_Changed
    watcher->EnableRaisingEvents = true;
 }
 //вот эта функция
 void watcher_Changed(Object^  sender, FileSystemEventArgs^  e)
 {
     textBox1->Text = "Hello"; //хотим вывести "Hello"в listBox1
 }


PS: С++ не самый удобный язык для работы с .Net, если религия позволяет лучше пользоваться С# или VB.
Re[2]: Проблема обращения к компоненту из функции
От: Аноним  
Дата: 31.01.08 09:53
Оценка:
Здравствуйте, Alexey M., Вы писали:

AM>PS: С++ не самый удобный язык для работы с .Net, если религия позволяет лучше пользоваться С# или VB.

Насчет удобства — это очень субъективно. Одному удобно одевать брюки через голову, а другому — нет.
Я писал на C++ под .NET и не испытывал никаких неудобств.
Re[3]: Проблема обращения к компоненту из функции
От: Alexey M.  
Дата: 31.01.08 10:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alexey M., Вы писали:


AM>>PS: С++ не самый удобный язык для работы с .Net, если религия позволяет лучше пользоваться С# или VB.

А>Насчет удобства — это очень субъективно. Одному удобно одевать брюки через голову, а другому — нет.
А>Я писал на C++ под .NET и не испытывал никаких неудобств.

Согласен насчет субъективности, но всетаки некоторые вещи на С# выглядят более лаконично.
Re[3]: Проблема обращения к компоненту из функции
От: Ziaw Россия  
Дата: 31.01.08 10:12
Оценка: 1 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Alexey M., Вы писали:


AM>>PS: С++ не самый удобный язык для работы с .Net, если религия позволяет лучше пользоваться С# или VB.

А>Насчет удобства — это очень субъективно. Одному удобно одевать брюки через голову, а другому — нет.
А>Я писал на C++ под .NET и не испытывал никаких неудобств.

сравните код:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
 {
    watcher->Deleted += gcnew FileSystemEventHandler(this, &Form1::watcher_Changed); //обращаемся к функции watcher_Changed
    watcher->EnableRaisingEvents = true;
 }
 //вот эта функция
 void watcher_Changed(Object^  sender, FileSystemEventArgs^  e)
 {
     textBox1->Text = "Hello"; //хотим вывести "Hello"в listBox1
 }


 private void button1_Click(object sender, EventArgs e) 
 {
    watcher.Deleted += watcher_Changed; //обращаемся к функции watcher_Changed
    watcher.EnableRaisingEvents = true;
 }
 //вот эта функция
 void watcher_Changed(object sender, FileSystemEventArgs e)
 {
     textBox1.Text = "Hello"; //хотим вывести "Hello"в listBox1
 }


можно не испытывать неудобств при написании первого участка, но второй писать явно удобнее. жду контрпример, описывающий преимущества программирования для .net на c++.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[4]: Проблема обращения к компоненту из функции
От: skiner.dp  
Дата: 31.01.08 15:07
Оценка:
Z>код:
Z>
Z>private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
Z> {
Z>    watcher->Deleted += gcnew FileSystemEventHandler(this, &Form1::watcher_Changed); //обращаемся к функции watcher_Changed
Z>    watcher->EnableRaisingEvents = true;
Z> }
Z> //вот эта функция
Z> void watcher_Changed(Object^  sender, FileSystemEventArgs^  e)
Z> {
Z>     textBox1->Text = "Hello"; //хотим вывести "Hello"в listBox1
Z> }
Z>


Извиняюсь что я такой ... , но до этого работал в Delphi там все с этим просто,но что-то у меня не работает, пишет: Additional information: Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.
В чем ещё проблема?
Re[5]: Проблема обращения к компоненту из функции
От: GlebZ Россия  
Дата: 31.01.08 15:44
Оценка:
Здравствуйте, skiner.dp, Вы писали:

SD>Извиняюсь что я такой ... , но до этого работал в Delphi там все с этим просто,но что-то у меня не работает, пишет: Additional information: Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.

SD>В чем ещё проблема?
В WinForms работа должна проходить только в одном треде. Это его ограничение. Обычно в главном.
Re[6]: Проблема обращения к компоненту из функции
От: skiner.dp  
Дата: 31.01.08 16:33
Оценка:
GZ>В WinForms работа должна проходить только в одном треде. Это его ограничение. Обычно в главном.
Как тогда мне тогда реализовать это на C#(то что я писал выше)?
Re[7]: Проблема обращения к компоненту из функции
От: GlebZ Россия  
Дата: 31.01.08 17:46
Оценка:
Здравствуйте, skiner.dp, Вы писали:

GZ>>В WinForms работа должна проходить только в одном треде. Это его ограничение. Обычно в главном.

SD>Как тогда мне тогда реализовать это на C#(то что я писал выше)?
Например используя invoke здесь
Автор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.
Re[8]: Проблема обращения к компоненту из функции
От: skiner.dp  
Дата: 31.01.08 19:08
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, skiner.dp, Вы писали:

GZ>Например используя invoke здесь
Автор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.

Почитал статью, в общем то понятно но не в моем случаи (
--------------------------------------
Все работает когда я делаю вот так:
        void test()
        {
            button2.Enabled = false;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            test();
        }


Возникает следующая проблема, когда я заместь:
void watcher_Changed(object sender, FileSystemEventArgs e)

пишу:
void watcher_Changed()

то происходит ошибка вот здесь:
watcher.Deleted += watcher_Changed;

No overload for 'watcher_Changed' matches delegate 'System.IO.FileSystemEventHandler'

И в конечном случаи никак не могу выполнить какое-то действие над компонентом из функции!
Кто может помогите, извиняюсь за такую назойливость но столкнулся раз столкнусь и в следующий раз. Заранее спасибо!
Re[5]: Проблема обращения к компоненту из функции
От: Интересующийся Россия  
Дата: 01.02.08 06:04
Оценка:
Здравствуйте, skiner.dp, Вы писали:

Z>>
Z>> void watcher_Changed(Object^  sender, FileSystemEventArgs^  e)
Z>> {
Z>>     textBox1->Text = "Hello"; //хотим вывести "Hello"в listBox1
Z>> }
Z>>


SD>что-то у меня не работает, пишет: Additional information: Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.

SD>В чем ещё проблема?

Пару дней назад писал ответ на подобный вопрос. Вопрос перешел в рубрику Q&A.
Там можно поискать по ключам BeginInvoke, EndInvoke,
но проще найти по имени моей функции SafeCall.
Re[9]: Проблема обращения к компоненту из функции
От: Ziaw Россия  
Дата: 01.02.08 07:08
Оценка:
Здравствуйте, skiner.dp, Вы писали:

SD>Здравствуйте, GlebZ, Вы писали:


GZ>>Здравствуйте, skiner.dp, Вы писали:

GZ>>Например используя invoke здесь
Автор(ы): Крис Селлз (Chris Sells)
Дата: 05.06.2003
В статье рассматривается использование многопоточности в приложениях Windows Forms на примере отображения хода длительной операции с использованием асинхронного делегата для запуска рабочего потока и метода Invoke для главной формы.

SD>Почитал статью, в общем то понятно но не в моем случаи (
SD>--------------------------------------
SD>Все работает когда я делаю вот так:
SD>
SD>        void test()
SD>        {
SD>            button2.Enabled = false;
SD>        }
SD>        private void button1_Click(object sender, EventArgs e)
SD>        {
SD>            test();
SD>        }
SD>


SD>Возникает следующая проблема, когда я заместь:

SD>
SD>void watcher_Changed(object sender, FileSystemEventArgs e)
SD>

SD>пишу:
SD>
SD>void watcher_Changed()
SD>

а зачем вы это делаете?

SD>то происходит ошибка вот здесь:

SD>
SD>watcher.Deleted += watcher_Changed; 
SD>

SD> No overload for 'watcher_Changed' matches delegate 'System.IO.FileSystemEventHandler'
метод подписываемый на эвент должен быть определнной сигнатуры, в данном случае
watcher_Changed(object sender, FileSystemEventArgs e)

о чем вам и говорится.
SD>И в конечном случаи никак не могу выполнить какое-то действие над компонентом из функции!
SD>Кто может помогите, извиняюсь за такую назойливость но столкнулся раз столкнусь и в следующий раз. Заранее спасибо!

вам же сказали, обращение к компонентам формы из другого потока надо оборачивать в Invoke();
            MethodInvoker d = delegate
            {
                textBox1.Text = "1";
            };
            Invoke(d);
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[6]: Проблема обращения к компоненту из функции
От: _Morpheus_  
Дата: 01.02.08 10:15
Оценка:
Здравствуйте, GlebZ, Вы писали:

SD>>Извиняюсь что я такой ... , но до этого работал в Delphi там все с этим просто,но что-то у меня не работает, пишет: Additional information: Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.

SD>>В чем ещё проблема?
GZ>В WinForms работа должна проходить только в одном треде. Это его ограничение. Обычно в главном.

нет, работу можно делать в скольки угодно потоках. Ограничение в том что к всем наследникам Control обращаться можно только из потока в котором они созданы и в котором работает очередь выборки сообщений (это главный поток, в котором начинается выполнение Main)
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[5]: Проблема обращения к компоненту из функции
От: _Morpheus_  
Дата: 01.02.08 10:18
Оценка:
Здравствуйте, skiner.dp, Вы писали:

Z>>код:

Z>>
Z>> //вот эта функция
Z>> void watcher_Changed(Object^  sender, FileSystemEventArgs^  e)
Z>> {
Z>>     textBox1->Text = "Hello"; //хотим вывести "Hello"в listBox1
Z>> }
Z>>


SD>В чем ещё проблема?


void watcher_Changed(Object^  sender, FileSystemEventArgs^  e)
{
    if(textBox1->InvokeRequired)
    {
        textBox1->Invoke(watcher_Changed, ... // как будут выглядеть параметры в C++ точно не скажу, думаю сами разберетесь...
        return;
    }
    textBox1->Text = "Hello"; //хотим вывести "Hello"в listBox1
}
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[7]: Проблема обращения к компоненту из функции
От: GlebZ Россия  
Дата: 01.02.08 11:09
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

GZ>>В WinForms работа должна проходить только в одном треде. Это его ограничение. Обычно в главном.

_M_>нет, работу можно делать в скольки угодно потоках. Ограничение в том что к всем наследникам Control обращаться можно только из потока в котором они созданы и в котором работает очередь выборки сообщений (это главный поток, в котором начинается выполнение Main)
Эти утверждения — почти эквивалентны. Единственное, каждое окно и контрол имеет собственную очередь.
Re[8]: Проблема обращения к компоненту из функции
От: _Morpheus_  
Дата: 01.02.08 11:22
Оценка:
Здравствуйте, GlebZ, Вы писали:

_M_>>нет, работу можно делать в скольки угодно потоках. Ограничение в том что к всем наследникам Control обращаться можно только из потока в котором они созданы и в котором работает очередь выборки сообщений (это главный поток, в котором начинается выполнение Main)

GZ>Эти утверждения — почти эквивалентны. Единственное, каждое окно и контрол имеет собственную очередь.

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

Цикл выборки сообщений запускается при вызове Application.Run. Если ты не будешь вызывать Application.Run, ты сможешь создать окно, но оно не будет реагировать на события...
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[9]: Проблема обращения к компоненту из функции
От: _Morpheus_  
Дата: 01.02.08 11:23
Оценка: +1
небольшая поправка — речь не об очереди, а о цикле выборке сообщений, т.е. читать нужно так — форма не имеет своего цикла выборки сообщений.
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[10]: Проблема обращения к компоненту из функции
От: skiner.dp  
Дата: 01.02.08 12:37
Оценка:
Большое спасибо за помощь!! Теперь разобрался!
Re[9]: Проблема обращения к компоненту из функции
От: GlebZ Россия  
Дата: 01.02.08 12:51
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

_M_>нет. Очередь выборки сообщений связана с контекстом потока (ThreadContext), окно не имеет своей очереди. Это легко можешь проверить, создай форму в потоке не имеющем цикла выборки сообщений и она не будет реагировать ни на какие сообщения...


Что нибудь типа:
ThreadPool.QueueUserWorkItem(CreateForm);
void CreateForm(object o)
{
 Form form=new Form();
 form.ShowDialog();
}

Должно работать 100 процентов.

_M_>Цикл выборки сообщений запускается при вызове Application.Run. Если ты не будешь вызывать Application.Run, ты сможешь создать окно, но оно не будет реагировать на события...


Каждый Win Gui контрол, будь то окно, кнопка и etc, имеет очередь сообщений. Это встроено в сам Windows. Другой вопрос как мы используем ее.
Re[10]: Проблема обращения к компоненту из функции
От: _Morpheus_  
Дата: 01.02.08 12:57
Оценка:
Здравствуйте, GlebZ, Вы писали:


GZ>Что нибудь типа:

GZ>
GZ> form.ShowDialog();
GZ>

GZ>Должно работать 100 процентов.

Вызов ShowDialog создает свой цикл выборки сообщений

_M_>>Цикл выборки сообщений запускается при вызове Application.Run. Если ты не будешь вызывать Application.Run, ты сможешь создать окно, но оно не будет реагировать на события...


GZ>Каждый Win Gui контрол, будь то окно, кнопка и etc, имеет очередь сообщений. Это встроено в сам Windows. Другой вопрос как мы используем ее.


контролы не имеют своего цикла выборки сообщений, в том числе и в WinAPI
... << RSDN@Home 1.2.0 alpha rev. 676>>
Re[3]: Проблема обращения к компоненту из функции
От: Dr.Gigabit  
Дата: 02.02.08 09:48
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Alexey M., Вы писали:


AM>>PS: С++ не самый удобный язык для работы с .Net, если религия позволяет лучше пользоваться С# или VB.

А>Насчет удобства — это очень субъективно. Одному удобно одевать брюки через голову, а другому — нет.
А>Я писал на C++ под .NET и не испытывал никаких неудобств.

Ключевое слово "писал".
... << RSDN@Home 1.2.0 alpha rev. 789>>
Re[11]: Проблема обращения к компоненту из функции
От: GlebZ Россия  
Дата: 02.02.08 13:36
Оценка:
Здравствуйте, _Morpheus_, Вы писали:

GZ>>Каждый Win Gui контрол, будь то окно, кнопка и etc, имеет очередь сообщений. Это встроено в сам Windows. Другой вопрос как мы используем ее.

_M_>контролы не имеют своего цикла выборки сообщений, в том числе и в WinAPI
Могу только отправить к какому нибудь учебнику по WinAPI. Как создаются окна, что такое WinProc, subclassing и т.д.
Re[12]: Проблема обращения к компоненту из функции
От: _Morpheus_  
Дата: 04.02.08 13:05
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>>>Каждый Win Gui контрол, будь то окно, кнопка и etc, имеет очередь сообщений. Это встроено в сам Windows. Другой вопрос как мы используем ее.

_M_>>контролы не имеют своего цикла выборки сообщений, в том числе и в WinAPI
GZ>Могу только отправить к какому нибудь учебнику по WinAPI. Как создаются окна, что такое WinProc, subclassing и т.д.

ну давайте, покажите мне такой учебник, где написано что окна будут получать сообщения, даже если в приложении не реализован цикл выборки сообщений...
... << RSDN@Home 1.2.0 alpha rev. 676>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.