Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2011, 00:57   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию Поиск в коде ошибки. Повторяется бесконечно!

Всем доброго времени суток!

Трабл с кодом:
Код:
procedure TAppThread.Execute;
const
  SleepTime = 200;
var
  i, d1, d2: integer; //counter
  Params: string;
  ConWND: HWND;
  Prc: Boolean;
  WaitResult,WaitResult2: Word;
  p,s:Cardinal;
begin
  repeat
    while AppInfo.ActiveTask do //пака задача активна
    begin
      for i := 1 to 10 do
      begin
        Synchronize(AppIsWaiting);
        Sleep(AppInfo.StartAfterHLR * 100); //спим после запуска программы указанное число секунд.
        Synchronize(AppIsRunning);
        if Terminated then //проверка..
        begin
          Synchronize(AppIsStopped);
          Exit;
        end;
      end;
      ZeroMemory(@SI, SizeOf(SI)); //нулируем память..
      SI.cb := SizeOf(StartupInfo);
      DateSeparator := '/';
      Params := StringReplace(AppInfo.RunParams, '%cod_datetime%', FormatDateTime('mm/dd/yyyy hh:nn:ss', now), [rfReplaceAll, rfIgnoreCase]);

      with PI do
      begin
        SetProcessAffinityMask(hProcess, AppInfo.CPUAffinity); //задаём маску проца из структуры

        if  (not AppInfo.ForceAffAndPriorChanging_flag) and (not AppInfo.EveryDayRestarting_flag) then
        begin
        CloseHandle(hProcess);
        CloseHandle(hThread);
        end;
        if not AppInfo.ForceAffAndPriorChanging_flag then
        begin
        HLRLog.HLR_ApplicationsLog('Flag compulsory issuing of priority and bind programs to specified CPU cores is not specified.');
        WaitForSingleObject(hProcess, INFINITE); //Следим постоянно
        end else
        begin
        HLRLog.HLR_ApplicationsLog('Forced display of the flag of priority and bind programs to specified CPU cores.');
        repeat
        WaitResult2:=WaitForSingleObject(hProcess, 1000); //Следим постоянно
        HLRLog.HLR_ApplicationsLog('Validation period response of 1 second (1000 milliseconds).');
        if WaitResult2 = WAIT_TIMEOUT then
          begin
            HLRLog.HLR_ApplicationsLog('Obtain the status of association process ['+IntToStr(hProcess)+'] of the CPU cores.');
            GetProcessAffinityMask(hProcess,p,s);
            HLRLog.HLR_ApplicationsLog('Associations for the process ['+IntToStr(hProcess)+'] ='+IntToStr(p));
            HLRLog.HLR_ApplicationsLog('Associations for the process ['+IntToStr(hProcess)+'] of resolving system ='+IntToStr(s));

            If not (p = Appinfo.CPUAffinity) then
            begin
            HLRLog.HLR_ApplicationsLog('Exhibited an association for the process ['+IntToStr(hProcess)+'] has been changed.');
            SetProcessAffinityMask(hProcess, AppInfo.CPUAffinity);
            HLRLog.HLR_ApplicationsLog('Forced to change the association CPU cores with "'+IntToStr(p)+'" to "'+IntToStr(AppInfo.CPUAffinity)+'" for the process ['+IntToStr(hProcess)+'].');
            end;

            HLRLog.HLR_ApplicationsLog('Check the priority of the process ['+IntToStr(hProcess)+'].');
            if not (GetPriority(AppInfo.CPUPriority) = GetPriorityClass(hProcess)) then
            begin
            HLRLog.HLR_ApplicationsLog('Observed change the priority of the process ['+IntToStr(hProcess)+'] anyone anything.');
            HLRLog.HLR_ApplicationsLog('Forced change the priority class of the process ['+IntToStr(hProcess)+'] with "'+IntToStr(GetPriorityClass(hProcess))+'" to "'+IntToStr(GetPriority(AppInfo.CPUPriority))+'".');
            SetPriorityClass(hProcess,GetPriority(AppInfo.CPUPriority));
            end;
       // CloseHandle(hProcess);
       // CloseHandle(hThread);
          end;
          until WaitResult2 <> WAIT_TIMEOUT;
        end;

        if not AppInfo.EveryDayRestarting_flag then //Если нет флага выключить В.
        begin
          HLRLog.HLR_ApplicationsLog('Thread waiting end of process time is infinite.');
          WaitForSingleObject(hProcess, INFINITE); //Следим постоянно
        end
        else //иначе
        begin
          HLRLog.HLR_ApplicationsLog('Thread waiting end of process time is 500 ms');
          repeat
            WaitResult := WaitForSingleObject(hProcess, 500);
            case AppInfo.EvDayRestartType of
              0:
                begin
                  if WaitResult = WAIT_TIMEOUT then
                  begin
                    d1 := CompareTime(Now, AppInfo.RestartInTime);
                    d2 := CompareDate(Now, AppInfo.RestartInDate);
                    if ((d1 = 0) or (d1 = 1) and (d2 = 0)) then
                    begin
                      HLRLog.HLR_ApplicationsLog('Application restarted by thread.');
                      TerminateProcess(Pi.hProcess, 0);
                      CloseHandle(hProcess);
                      CloseHandle(hThread);
                      AppInfo.EveryDayRestarting_flag := False;
                      Synchronize(AppIsRestarting);
                    end;
                  end;
                end;
продолжение см. пост 2
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 00:57   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Код:
              1:
                begin
                  if WaitResult = WAIT_TIMEOUT then
                  begin
                    d1 := CompareTime(Now, AppInfo.RestartInTime);
                    d2 := CompareDate(Now, AppInfo.RestartInDate);
                    if ((d1 = 0) or (d1 = 1)) and (d2 = 0) then
                    begin
                      HLRLog.HLR_ApplicationsLog('Application CLOSED by thread.');
                      AppInfo.ActiveTask := False;
                      TerminateProcess(Pi.hProcess, 0);
                      CloseHandle(hProcess);
                      CloseHandle(hThread);
                      Synchronize(AppIsStopped);
                      Terminate;
                      Break;
                    end;
                  end;
                end;
            end;
          until WaitResult <> WAIT_TIMEOUT;
        end;
      end;

     for i:=1 to 10 do
      begin
        if Terminated then
        begin
          Synchronize(AppIsStopped);
          Exit;
        end;
      end;

      prc := CreateProcess(
        PChar(AppInfo.FileExe),
        PChar('"' + AppInfo.FileExe + '" ' + AppInfo.RunParams), nil, nil,
        False, GetPriority(AppInfo.CPUPriority), nil,
        PChar(ExtractFilePath(AppInfo.FileExe)), SI, PI); //создаём процесс
      if Prc then
      begin
        HLRLog.HLR_ApplicationsLog('Process: EXE: ' + ExtractFileName(AppInfo.FileExe) + ' PID: ' + IntToStr(PI.dwProcessId) + ' in TID: ' + IntToStr(PI.dwThreadId) + ' created succseflly!');
        WaitForInputIdle(PI.hProcess, 1000); //     ждём создания всех окошек
        Synchronize(AppIsRunning);
        if not (AppInfo.OtherCaption = '') then
        begin
          HLRLog.HLR_ApplicationsLog('Programming changing other application windows tittle.');
          if AppInfo.Console_flag then
          begin
            if not (AppInfo.OtherCaption = '') then
            begin
              Sleep(SleepTime);
              AttachConsole(pi.dwProcessId);
              ConWND := GetConsoleWindow;
              SetWindowText(ConWnd, PChar(AppInfo.OtherCaption));
              FreeConsole;
              HLRLog.HLR_ApplicationsLog('Console window. ' + '[EXE: ' + ExtractFileName(AppInfo.FileExe) + '] PID:' + IntToStr(PI.dwProcessId) + ' Changed caption to: ' + AppInfo.OtherCaption);
            end
            else
            begin
              HLRLog.HLR_ApplicationsLog('Can not change caption.' + '[EXE: ' + ExtractFileName(AppInfo.FileExe) + '] PID:' + IntToStr(PI.dwProcessId));
              Exit;
            end;
          end
          else
          begin
            if not (AppInfo.OtherCaption = '') then
            begin
              EnumThreadWindows(PI.dwThreadId, @ChangeCaptionProc, Integer(AppInfo.OtherCaption)); //передаём параметр функции
              HLRLog.HLR_ApplicationsLog('GUI Window. ' + '[EXE: ' + ExtractFileName(AppInfo.FileExe) + '] PID:' + IntToStr(PI.dwProcessId) + ' Changed caption to: ' + AppInfo.OtherCaption);
            end
            else
            begin
              HLRLog.HLR_ApplicationsLog('Can not change caption.' + '[EXE: ' + ExtractFileName(AppInfo.FileExe) + '] PID:' + IntToStr(PI.dwProcessId));
              Exit;
            end;
          end;
        end;
и ещё...
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 01:00   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Код:
        if AppInfo.StartMinimized then //Минимизируем окошко.. если стоит галочка
        begin
          HLRLog.HLR_ApplicationsLog('Принудительная минимизация окна программы.');
          if AppInfo.Console_flag then
          begin
            Sleep(SleepTime);
            AttachConsole(pi.dwProcessId);
            ConWND := GetConsoleWindow;
            FreeConsole;
            ShowWindow(ConWND, SW_SHOWMINIMIZED);
            HLRLog.HLR_ApplicationsLog('Console window [' + IntToStr(PI.dwThreadId) + '] minimized by thread.');
          end
          else
          begin
            EnumThreadWindows(PI.dwThreadId, @MiniWindowProc, 0); //манипулируем с окном...
            HLRLog.HLR_ApplicationsLog('GUI window [' + IntToStr(PI.dwThreadId) + '] minimized by thread.');
          end;
        end;

        if AppInfo.ActiveTask then
        begin
          if not ((AppInfo.EveryDayRestarting_flag= true) and (AppInfo.EvDayRestartType = 1)) then
            //не использовать это если указано закрыть программу в указанное время
          begin
            for i := 1 to 10 do //перезапуск прииложения при падении
            begin
              Synchronize(AppIsWaiting);
              Sleep(AppInfo.RestartAfterError * 100);
              if Terminated then
              begin
                Synchronize(AppIsStopped);
                Exit;
              end;
            end;
          end;
        end;

        HLRLog.HLR_ApplicationsLog('Restarting: Name: ' + AppInfo.ListName + ' [EXE: ' + ExtractFileName(AppInfo.FileExe) + '] PID:' + IntToStr(PI.dwProcessId));
      end
      else
      begin
        AppInfo.ActiveTask := False;
        HLRLog.HLR_ApplicationsLog('Can not create process: EXE: ' + ExtractFileName(AppInfo.FileExe) + ' PID: ' + IntToStr(PI.dwProcessId) + ' in TID: ' + IntToStr(PI.dwThreadId) + ' System error code: ' + IntToStr(GetLastError) + ' With Message: ' + SysErrorMessage(GetLastError));
        Synchronize(CanNotStarted);
        Terminate;
      end;
    end;
     //Цикл While
  until AppInfo.AutoRestart <= 0; //перезапуск через указанное время.
end;
Проблема в том что CreateProcess бесконечно повторяется.
Компилятор выдал пару раз для циклов For i:=1 to 10 do замечание "Assignment to FOR-Loop variable 'i'"

Как избавиться от бага, который так долго и упорно ловил... ?

Последний раз редактировалось Человек_Борща; 08.01.2011 в 01:11.
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 13:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ух Ё...
Это нужно ее отлаживать... На взгляд так врядли кто скажет
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.01.2011, 13:27   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

хм, а поповоду придупреждения можете что-нибудь сказать?
Если нельзя показать где ошибка, то как в цикле сделать остановку? Чтоб не повторялось что-либо много раз....
Я думаю что это в циклах For .. to .. do проблема.
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 13:38   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
а поповоду придупреждения можете что-нибудь сказать?
Знать бы еще на какой оно строчке вылазит ))) Я, извини, уже не телепат - лицензию отобрали, за несанкционированые проникновения в моск Пентагонцев
ИМХО, пока пошаговку не провести - не выловить баг.
Или хотя бы поставь бряки на строки с CreateProcess, и узнай как и откуда она вызывается
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.01.2011, 13:56   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Предупреждения выпадали тут:
Код:
            for i := 1 to 10 do //перезапуск прииложения при падении
            begin
              Synchronize(AppIsWaiting);
              Sleep(AppInfo.RestartAfterError * 100);
              if Terminated then
              begin
                Synchronize(AppIsStopped);
                Exit;
              end;
            end;
и тут:
Код:
     for i:=1 to 10 do
      begin
        if Terminated then
        begin
          Synchronize(AppIsStopped);
          Exit;
        end;
      end;
Проблема в том что нельзя выловить баг, оно прыгает на цикл While и все повторяет сначало.

P.S. У одного меня так код в теге CODE растянут по вертикали? Или это новая фича форума?

_______добавлено

Есть мысли?

Последний раз редактировалось Человек_Борща; 08.01.2011 в 15:25.
Человек_Борща вне форума Ответить с цитированием
Старый 08.01.2011, 15:45   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Проблема в том что нельзя выловить баг, оно прыгает на цикл While и все повторяет сначало.
Нет. Так не скажешь. Нужно пошаговку делать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.01.2011, 01:14   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Держи: http://www.gunsmoker.ru/2011/01/blog-post.html

P.S. Странно, мне казалось я отвечал в этой теме. Удалили ответ, что-ли?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 16.01.2011, 01:27   #10
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Эмм.. может драка нитей за что то общее?
Цитата:
Проблема в том что нельзя выловить баг, оно прыгает на цикл While и все повторяет сначало.
Если я правильно понял то, наверно его побуждает другая нить.. Может в этом направлении надо рыть? Так сказать за брейкить еще и другие нити?
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибки в коде для Builder C++ ололошенько C++ Builder 21 22.08.2010 15:26
ошибки в коде вычисления арифметических выражений на с++ Euforia_PZAS09_1 Помощь студентам 5 11.03.2010 20:42
Поиск в HTML-коде M@G Общие вопросы Delphi 6 20.01.2010 12:43
Поиск в HTML-коде _SERGEYX_ Работа с сетью в Delphi 15 17.01.2008 12:54