Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Зависание FormMain после запуска внешней программы.

30K
08 мая 2009 года
asmel
50 / / 05.03.2009
Всем доброе предпраздничное утро!
Проблема - при запуске внешней программы из главной формы, после некоторого времени работы внешней программы, главная форма теряет активацию (красный крестик в правом верхнем углу формы становится серым) управление внешними программами при этом теряется (при наведении мышки на кнопки в FormMain возникает символ песочных часов и никакого управления). Как бы это победить?
_____________________
"Котам нельзя! С котами нельзя! Брысь! Слезай, а то милицию позову!"© М. Булгаков. Мастер и маргарита
246
08 мая 2009 года
GIZMO
1.8K / / 30.07.2004
Цитата: asmel
Всем доброе предпраздничное утро!
Проблема - при запуске внешней программы из главной формы, после некоторого времени работы внешней программы, главная форма теряет активацию (красный крестик в правом верхнем углу формы становится серым) управление внешними программами при этом теряется (при наведении мышки на кнопки в FormMain возникает символ песочных часов и никакого управления). Как бы это победить?


хорошо-бы код увидеть...

ЗЫ: я тебя предупреждал кстати, что на котов наезжать не нужно, я котов уважаю, у меня русская голубая дома живет.

30K
08 мая 2009 года
asmel
50 / / 05.03.2009
GIZMO
Я ни на кого не наезжаю. Выкатываю код целиком, прошу прощения за, может быть, необычную запись кода - академеев не заканчивали.
Из FormMain запускается внешняя программа Dbridge.exe, которая обрабатывает тысячу... файлов, последовательно беря их из директории. После каждой обработки внешняя программа закрывается и с новым файлом начинается все заново в цикле. Где-то на третьем файле FormMain вешается.... , хотя после обработки всех файлов из формы можно управлять процессом.

Код:
void __fastcall TFormMain::RunClick(TObject *Sender)

{
  int i;
  int k;
  int con_fl;
  float v;
  long m_l;
  char m_str[] = "123456";
  AnsiString m;
  AnsiString m_1;
  char char_v[] = "12345";

 char mel[20] = {0};
 char mel_par[] = "/f E:\\RAW\\mel_izm_320.raw";
 WIN32_FIND_DATA wfd = {0};

 DWORD sn; //номер раздела С при форматировании
 GetVolumeInformation("C:\\", 0, 0, &sn, 0, 0, 0, 0);

 //получить хедлы окон моей программы
 HWND m_p = FindWindow(NULL, "Моя программа");
 Sleep(300);
 HWND m_p_e = FindWindowEx( m_p, NULL, "TEdit", NULL);

 // получить данные из полей ввода
 strcpy(mel, EditText -> Text.c_str());
 if (mel[0]== NULL){con_fl = 10000;}
 if (mel[0]!= NULL){con_fl = EditText->Text.ToInt();}

 // Поиск первого файла в директории
 HANDLE f_n = FindFirstFile("E:\\RAW\\*.*", &wfd);
 FindNextFile(f_n, &wfd);


  SHELLEXECUTEINFO SEI = {0};
  SEI.cbSize= sizeof(SHELLEXECUTEINFO);
  SEI.fMask = SEE_MASK_NOCLOSEPROCESS;
  SEI.nShow = SW_SHOWNORMAL;
  SEI.lpFile = "E:\\Dbridge\\Dbridge.exe";
  SEI.lpParameters = mel_par;


 bool m_osh = true;
 int n = 1;
 while (m_osh == true)
{

//Поиск следующих файлов в директории E:\RAW
 FindNextFile(f_n, &wfd);
 k = -1;
 while (k != 15){k++; mel_par[k + 10] = wfd.cFileName[k];}

 i = i;

//Проверка отработанных файлов в директории G:\Работа\Спектры
 char mel_otr_fl[] = "G:\\Работа\\Спектры\\xxx\\mel_izm_000.txt";
 k = -1;
 while (k != 11){k++; mel_otr_fl[k + 22] = wfd.cFileName[k];}

 if (PathFileExists(mel_otr_fl)!= true)
  {

  m_osh = false;
  m_osh = ShellExecuteEx(&SEI); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  WaitForSingleObject(SEI.hProcess, INFINITE);

  Sleep(8000);

 i = i;


/*
  // Ловля хендлa "Data Bridg..."
  HWND d_br_5 = 0;
  //int t = GetTickCount();
  k = 1;
  while (d_br_5 == 0 & k != 100)
  {k++;
  Sleep(10);
  d_br_5 = FindWindow(NULL, _T("DataBridge"));}

  // пока окно видно, программа стоит
  while (IsWindowVisible(d_br_5)) { Sleep(100);}
*/




//  Sleep(8000);

// SetActiveWindow(m_p);

 //Посылка на вывод числа отработанных файлов
 char n_char[] = "12345";
 itoa(n, n_char, 10);
 SendMessage(m_p_e, WM_SETTEXT, 10, (int)n_char);
 Sleep(200);
 UpdateWindow(m_p_e);

 //выйти из цикла, если окно не открывается
//  if (d_br_5 == NULL){goto mel;}

  //выйти из цикла, если набрано нужное число файлов
  if ( n == con_fl){goto mel;}


  n++;

 }

}
mel: i = i;

// вывести результат в поле метки
   Label3 -> Caption = "Работа сделана :   " +
                FloatToStrF(n,ffGeneral,7,2) + "  файла";

}
14
08 мая 2009 года
Phodopus
3.3K / / 19.06.2008
Ну так ваша программа покорно ждет завершения работы каждого созданного ею процесса, а при таком ожидании сообщения обрабатываться не будут и окно зависнет
30K
08 мая 2009 года
asmel
50 / / 05.03.2009
Phodopus
Вообще-то
 
Код:
m_osh = ShellExecuteEx(&SEI); //
WaitForSingleObject(SEI.hProcess, INFINITE);

После этого процесс закрывается и заново открывается новый.
Но, если я неправ, что нужно сделать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог