Как показать индикатор выполнения в одном окне, а другой - открыть [дубликат]

Объявлено, но не определено переменная или функция.

Типичным объявлением переменной является

extern int x;

. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:

int x;

Например, следующее генерирует ошибку:

extern int x;
int main()
{
    x = 0;
}
//int x; // uncomment this line for successful definition

Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:

void foo(); // declaration only
int main()
{
   foo();
}
//void foo() {} //uncomment this line for successful definition

Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:

void foo(int& x);
int main()
{
   int x;
   foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
                          //for void foo(int& x)

Другие примеры несоответствий включают

  • Функция / переменная, объявленная в одном пространстве имен, определенное в другом.
  • Функция / переменная, объявленная как член класса, определяемая как глобальная (или наоборот).
  • Тип возвращаемого значения функции, номер и типы параметров и соглашение о вызове не совсем точно согласуются.

Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.

12
задан svick 25 January 2014 в 01:10
поделиться

2 ответа

С .NET 4.5 (или .NET 4.0 + Microsoft.Bcl.Async ) лучший способ - использовать API Task и async/await. Это позволяет использовать удобный (псевдо) последовательный рабочий процесс кода и иметь структурированную обработку исключений.

Пример:

private async void Start(object sender, RoutedEventArgs e)
{
    try
    {
        await Task.Run(() =>
        {
            int progress = 0;
            for (; ; )
            {
                System.Threading.Thread.Sleep(1);
                progress++;
                Logger.Info(progress);
            }
        });
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Дополнительная информация:

Async в 4.5: Разрешение и аннулирование в асинхронных API .

Async и Await .

Async / Await FAQ .

18
ответ дан Noseratio 31 August 2018 в 09:35
поделиться

Вы можете выполнить операцию в отдельном потоке в WPF, используя класс BackgroundWorker.

проверить этот пример Как использовать фоновый рабочий стол WPF

И читайте о классе в MSDN здесь http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

5
ответ дан Community 31 August 2018 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: