Приложение C Builder RAD 2010 RTL / VCL-> Terminate () НЕ ПРЕКРАЩАЕТ ЗАЯВЛЕНИЕ - PullRequest
4 голосов
/ 21 апреля 2010

У меня также есть проблема, описанная здесь: http://www.delphigroups.info/3/9/106748.html

Я пробовал почти все формы размещения функции Application-> Terminate () везде в коде, следуя и не возвращая 0, 'ExitProcess (0)', 'ExitThread (0)', выход (0).Ни один рабочий вариант не закрывает приложение.Вместо этого выполняется код после оператора Application-> Terminate ().

У меня есть два или более потоков в приложении.Я попытался вызвать терминировать func в созданных после выполнения потоках и в основном потоке.

Также это не связано (насколько я могу представить) с CodeGuard / madExcept (я выключил и включил, никакого эффекта),Поворот CodeGuard также не увенчался успехом.

Единственный рабочий вариант кода - это поместить Application-> Terminate () в любой из обработчиков OnClick любой кнопки формы.Но это не вписывается в мои потребности.Мне нужно прекратить в любом месте.

Что мне нужно сделать, чтобы прервать все потоки в приложении C ++ Builder 2010 и затем завершить процесс?

1 Ответ

3 голосов
/ 22 апреля 2010

Application-> Terminate () не закрывает приложение сразу, оно только сигнализирует о том, что вы хотите закрыть приложение.

Завершение звонков Windows API Функция PostQuitMessage для выполнения упорядоченное завершение работы приложения. Завершение не является немедленным.

В ваших функциях вызовите Application-> ProcessMessages () , затем проверьте, является ли свойство Application-> Termination истинным.

Для приложений, использующих Вычислительные циклы, вызов ProcessMessages периодически, и Также проверьте Завершено, чтобы определить следует ли прервать расчет и разрешить завершать приложение

Например:

void Calc()
{
  for (int x = 0; x < 1000000; ++x)
  {
    // perform complex calculation

    // check if need to exit
    Application->ProcessMessages();
    if (Application->Terminated)
    {
      break;
    } // end if
  } // end for

  // clean up
} 
...