P.S.:недавно токо начал учить C++.net
Ну в общем сделал, что при нажатии на кнопку идёт обращение к статической функции, или просто к функции, ну там что-то выполняет и должна ответ вывести в listBox. Токо вот проблема в функции watcher_Changed компонента textBox1 просто не видно(у меня одна форма). Как и где объявить что бы было видно компонент из функции и можно было к нему обращаться????
Здравствуйте, 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 и не испытывал никаких неудобств.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Alexey M., Вы писали:
AM>>PS: С++ не самый удобный язык для работы с .Net, если религия позволяет лучше пользоваться С# или VB. А>Насчет удобства — это очень субъективно. Одному удобно одевать брюки через голову, а другому — нет. А>Я писал на C++ под .NET и не испытывал никаких неудобств.
Согласен насчет субъективности, но всетаки некоторые вещи на С# выглядят более лаконично.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, 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
}
можно не испытывать неудобств при написании первого участка, но второй писать явно удобнее. жду контрпример, описывающий преимущества программирования для .net на c++.
Извиняюсь что я такой ... , но до этого работал в Delphi там все с этим просто,но что-то у меня не работает, пишет: Additional information: Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on.
В чем ещё проблема?
Здравствуйте, 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 работа должна проходить только в одном треде. Это его ограничение. Обычно в главном.
GZ>В WinForms работа должна проходить только в одном треде. Это его ограничение. Обычно в главном.
Как тогда мне тогда реализовать это на C#(то что я писал выше)?
Здравствуйте, skiner.dp, Вы писали:
GZ>>В WinForms работа должна проходить только в одном треде. Это его ограничение. Обычно в главном. SD>Как тогда мне тогда реализовать это на C#(то что я писал выше)?
Например используя invoke здесь
No overload for 'watcher_Changed' matches delegate 'System.IO.FileSystemEventHandler'
И в конечном случаи никак не могу выполнить какое-то действие над компонентом из функции!
Кто может помогите, извиняюсь за такую назойливость но столкнулся раз столкнусь и в следующий раз. Заранее спасибо!
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.
а зачем вы это делаете?
SD>то происходит ошибка вот здесь: SD>
SD>watcher.Deleted += watcher_Changed;
SD>
SD> No overload for 'watcher_Changed' matches delegate 'System.IO.FileSystemEventHandler'
метод подписываемый на эвент должен быть определнной сигнатуры, в данном случае
о чем вам и говорится. SD>И в конечном случаи никак не могу выполнить какое-то действие над компонентом из функции! SD>Кто может помогите, извиняюсь за такую назойливость но столкнулся раз столкнусь и в следующий раз. Заранее спасибо!
вам же сказали, обращение к компонентам формы из другого потока надо оборачивать в Invoke();
MethodInvoker d = delegate
{
textBox1.Text = "1";
};
Invoke(d);
Здравствуйте, 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)
void watcher_Changed(Object^ sender, FileSystemEventArgs^ e)
{
if(textBox1->InvokeRequired)
{
textBox1->Invoke(watcher_Changed, ... // как будут выглядеть параметры в C++ точно не скажу, думаю сами разберетесь...return;
}
textBox1->Text = "Hello"; //хотим вывести "Hello"в listBox1
}
Здравствуйте, _Morpheus_, Вы писали:
GZ>>В WinForms работа должна проходить только в одном треде. Это его ограничение. Обычно в главном. _M_>нет, работу можно делать в скольки угодно потоках. Ограничение в том что к всем наследникам Control обращаться можно только из потока в котором они созданы и в котором работает очередь выборки сообщений (это главный поток, в котором начинается выполнение Main)
Эти утверждения — почти эквивалентны. Единственное, каждое окно и контрол имеет собственную очередь.
Здравствуйте, GlebZ, Вы писали:
_M_>>нет, работу можно делать в скольки угодно потоках. Ограничение в том что к всем наследникам Control обращаться можно только из потока в котором они созданы и в котором работает очередь выборки сообщений (это главный поток, в котором начинается выполнение Main) GZ>Эти утверждения — почти эквивалентны. Единственное, каждое окно и контрол имеет собственную очередь.
нет. Очередь выборки сообщений связана с контекстом потока (ThreadContext), окно не имеет своей очереди. Это легко можешь проверить, создай форму в потоке не имеющем цикла выборки сообщений и она не будет реагировать ни на какие сообщения...
Цикл выборки сообщений запускается при вызове Application.Run. Если ты не будешь вызывать Application.Run, ты сможешь создать окно, но оно не будет реагировать на события...
Здравствуйте, _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]: Проблема обращения к компоненту из функции
Вызов ShowDialog создает свой цикл выборки сообщений
_M_>>Цикл выборки сообщений запускается при вызове Application.Run. Если ты не будешь вызывать Application.Run, ты сможешь создать окно, но оно не будет реагировать на события...
GZ>Каждый Win Gui контрол, будь то окно, кнопка и etc, имеет очередь сообщений. Это встроено в сам Windows. Другой вопрос как мы используем ее.
контролы не имеют своего цикла выборки сообщений, в том числе и в WinAPI
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Alexey M., Вы писали:
AM>>PS: С++ не самый удобный язык для работы с .Net, если религия позволяет лучше пользоваться С# или VB. А>Насчет удобства — это очень субъективно. Одному удобно одевать брюки через голову, а другому — нет. А>Я писал на C++ под .NET и не испытывал никаких неудобств.
Ключевое слово "писал".
... << RSDN@Home 1.2.0 alpha rev. 789>>
Re[11]: Проблема обращения к компоненту из функции
Здравствуйте, _Morpheus_, Вы писали:
GZ>>Каждый Win Gui контрол, будь то окно, кнопка и etc, имеет очередь сообщений. Это встроено в сам Windows. Другой вопрос как мы используем ее. _M_>контролы не имеют своего цикла выборки сообщений, в том числе и в WinAPI
Могу только отправить к какому нибудь учебнику по WinAPI. Как создаются окна, что такое WinProc, subclassing и т.д.
Re[12]: Проблема обращения к компоненту из функции
Здравствуйте, GlebZ, Вы писали:
GZ>>>Каждый Win Gui контрол, будь то окно, кнопка и etc, имеет очередь сообщений. Это встроено в сам Windows. Другой вопрос как мы используем ее. _M_>>контролы не имеют своего цикла выборки сообщений, в том числе и в WinAPI GZ>Могу только отправить к какому нибудь учебнику по WinAPI. Как создаются окна, что такое WinProc, subclassing и т.д.
ну давайте, покажите мне такой учебник, где написано что окна будут получать сообщения, даже если в приложении не реализован цикл выборки сообщений...