Стандарт C ++ требует определения для вашего статического члена константы, если определение каким-то образом необходимо.
Требуется определение, например, если используется его адрес. push_back
принимает свой параметр с помощью ссылки const, и поэтому строгому компилятору нужен адрес вашего члена, и вам нужно определить его в пространстве имен.
Когда вы явно используете константу, вы создаете временное, и это временное, которое связано с ссылкой (по специальным правилам в стандарте).
Это действительно интересный случай, и я на самом деле думаю, что стоит подняться вопрос, чтобы std был изменен на имеют одинаковое поведение для вашего постоянного члена!
Хотя, в каком-то странном виде это можно рассматривать как законное использование унарного оператора «+». В основном результат unary +
является rvalue, поэтому применяются правила привязки rvalues к ссылкам const, и мы не используем адрес нашего статического члена const:
v.push_back( +Foo::MEMBER );
this.Invoke(new Action(() => { MessageBox.Show(this, "text"); }));
Это переключится на основной поток и покажет MessageBox с родителем form1
.
if ( Form1.InvokeRequired ) {
Form1.Invoke((Action)delegate{MessageBox.Show(Form1,"Hello");});
}
Попробуйте использовать backgroundworker .
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//Helper thread: Long during task
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//We're in the main thread: Show your messagebox
}
Хотя выбранный ответ обеспечивает хороший способ отображения MessageBox
из асинхронного потока, он не обрабатывает случай, когда вы хотите извлечь DialogResult
из показанного MessageBox
.
Если вы хотите вернуть DialogResult
из вызываемого MessageBox
, отображаемого поверх Form
. Затем вам нужно использовать делегат Func
вместо делегата Action
.
Action
делегаты всегда возвращают void, тогда как Func
имеет возвращаемое значение.
Вот небольшой метод, который я разработал для обработки этого конкретного сценария:
private DialogResult BackgroundThreadMessageBox(IWin32Window owner, string text)
{
if (this.InvokeRequired)
{
return (DialogResult) this.Invoke(new Func<DialogResult>(
() => { return MessageBox.Show(owner, text); }));
}
else
{
return MessageBox.Show(owner, text);
}
}
Хотя это обычно не считается лучшей практикой или дизайном, он будет работать в крайнем случае.
В моем случае я был в другом классе и имел ссылку для текстового поля, поэтому я использовал следующий код:
_txtResultado.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate ()
{
MessageBox.Show("My message!");
}));
this
используйте экземпляр вашей формы1 – Stecya 18 March 2011 в 09:32