Когда вы уже наконец совместите МТ4 с новой программой "Vista"??? - страница 4

 
chv:

Дело в том, что я запускаю терминалы автоматизированным способом с параметрами командной строки из сетевой распределённой системы с центральной SQL базой, и хочу получить устойчивую работу всей данной системы с большим числом клиентских мест на протяжении нескольких недель и месяцев. Но периодически терминалы зависают в памяти, им внешняя система отводит на один прогон теста какое-то время (by default 120 sec., это можно менять) и потом закрывает процесс терминала (kill process), после чего перезапускает его заново. Так вот, иногда эта ситуация впадает в бесконечный цикл, т.е. судя по моим логам, терминал не отработал за отведённое время, его процесс система прибила, попробовала запустить заново, но это шаг не удался.

Просто kill process делать нельзя. Закрывать терминал надо правильно, понимая процессы, идущие в нем. Ниже приведен код закрытия терминала, который использовался Championship Tester'е:

volatile UINT  ExtInternalMsg=0;           // для внутреннего процессинга
volatile UINT  ExtInternalHandle=0;        // для внутреннего процессинга
 
 
//---- регистрируем свои сообщения
   ExtInternalMsg   =RegisterWindowMessage("MetaTrader4_Internal_Message");
 
 
//+------------------------------------------------------------------+
//| Проверка наличия запущенного МетаТрейдера                        |
//+------------------------------------------------------------------+
BOOL CALLBACK CTester::SearchExistingTrader(HWND hwnd, LPARAM /*lParam*/)
  {
   char  tmp[256];
//---- пропустим пустые или левые окна
   ::GetClassName(hwnd,tmp,250);
   if(strcmp(tmp,"MetaQuotes::MetaTrader::4.00")!=0) return(TRUE); // не нашего рода...
//---- безусловно отказываемся работать
   return(FALSE);
  }
//+------------------------------------------------------------------+
//| Проверка наличия запущенного МетаТрейдера                        |
//+------------------------------------------------------------------+
BOOL CALLBACK CTester::SearchAndCloseExistingTrader(HWND hwnd, LPARAM /*lParam*/)
  {
   char  tmp[256];
//---- пропустим пустые или левые окна
   ::GetClassName(hwnd,tmp,250);
   if(strcmp(tmp,"MetaQuotes::MetaTrader::4.00")!=0) return(TRUE); // не нашего рода...
//--- пошлем команду остановки тестирования, затем закрытия окна
   ::PostMessage(hwnd,ExtInternalMsg,28,0);
   Sleep(1000);
   ::PostMessage(hwnd,WM_CLOSE,0,0);
//---- безусловно отказываемся работать
   return(FALSE);
  }
 
//+------------------------------------------------------------------+
//| Запуск терминала                                                 |
//+------------------------------------------------------------------+
bool CTester::StartTerminal(UserRecord *user)
  {
   char                 tmp[256];
   STARTUPINFO          si={0};
   PROCESS_INFORMATION  pi={0};
   DWORD                resid=-1,res;
//--- запустим терминал в тестирование с указанным профайлом
   si.cb=sizeof(si);
   _snprintf(tmp,sizeof(tmp)-1,"%s\\MetaTrader\\terminal.exe starter.ini",ExtProgramPath);
   CreateProcess(NULL,tmp,NULL,NULL,FALSE,0 /*CREATE_NO_WINDOW*/,NULL,ExtProgramPath,&si,&pi);
//--- ждем завершения не более 5 минут
   if((res=WaitForSingleObject(pi.hProcess,m_config_timeout*60*1000))!=WAIT_OBJECT_0)
     {
      ExtLogger.Out("Tester  : %d tester takes too long time (more than %d minutes)\r\n",user->login,m_config_timeout);
      //---- найдем окно терминала и пошлем в него сообщение о закрытии
      ::EnumWindows(SearchAndCloseExistingTrader,0);
      Sleep(10000);                                 // подождем 10 сек, а потом еще раз пошлем
      //---- найдем окно терминала и пошлем в него сообщение о закрытии
      ::EnumWindows(SearchAndCloseExistingTrader,0);
      Sleep(30000);  // ждем еще 30 сек, так как некоторые эксперты зацикленные и не жалают сами выходить
      //--- и на всякий случай грохнем процесс, если он остался в памяти
      TerminateProcess(pi.hProcess,-1);
     }
   CloseHandle(pi.hThread);
   CloseHandle(pi.hProcess);
//--- на всякий случай подождем
   Sleep(5000);
//--- вернем результат
   return(res==WAIT_OBJECT_0 ? true:false);
  }
Крешлог можно найти в файле /logs/crashlog.log
 

Отлично, Ренат и Станислав, спасибо Вам.

 

Ренат, ещё раз благодарю Вас за весьма полезный код. Могу в ответ поделиться своим, который создал на его основе, и результатами его отработки.

На практике в тестах принудительного закрытия терминал завершается от первого до пятого шага (время задержки растёт):

 
Renat:
ArtemRG:

Аналогично, под Vista при попытке в редакторе сделать copy-paste - редактор падает.

Опубликуйте здесь крешлог, пожалуйста.


случилось

упал редактор при выполнении copy. В нем было открыто 9 файлов, если это имеет значение. Пока это окно не было закрыто, во всех программах перестало работать copy.

В папке logs ни каких крэшлогов не появилось.

 
Windows Visla, Windows Visnet, Windows будет Visnut!!! :)))
 
ArtemRG:
Renat:
ArtemRG:

Аналогично, под Vista при попытке в редакторе сделать copy-paste - редактор падает.

Опубликуйте здесь крешлог, пожалуйста.


случилось

упал редактор при выполнении copy. В нем было открыто 9 файлов, если это имеет значение. Пока это окно не было закрыто, во всех программах перестало работать copy.

В папке logs ни каких крэшлогов не появилось.

Спасибо, будем искать причину.
 

Ренат, скажите, пожалуйста, какой код команды нужно послать терминалу для остановки оптимизатора? Аналог этого, который Вы дали для тестера, не останавливает терминал-оптимизатор:

//--- пошлем команду остановки тестирования, затем закрытия окна
   ::PostMessage(hwnd,ExtInternalMsg,28,0);

Дело в том, что я пробовал давать процессу терминала после запуска мало времени перед закрытием (~10-12 сек.), и после запускал описанную выше процедуру корректного закрытия терминала. Тестер завершал свою работу, оптимизатор же после такой команды продолжал свою работу до полной отработки переборов комбинаций.

 
Эта же команда и должна останавливать оптимизатор. Поэкспериментируйте с таймаутами, пожалуйста.
 

У меня Windows Vista Home Premium постоянно при запуски тестера (даже с совместимостью с Windows XP SP2) выкидывает из программы и выдает такое окно:

There has been a critical error
Time : 2008.04.02 02:38
Program : Client Terminal
Version : 4.00 (build: 213, 18 Mar 2008)
OS : Windows Vista Professional 6.0 (Build 6000)
Processors : 2 x X86 (level 6)
Memory : 2094912/929488 kb
Exception : C0000005
Address : 0046275F
Access Type : read
Access Addr : 00000300

Registers : EAX=02798E88 CS=001b EIP=0046275F EFLGS=00010206
: EBX=00000000 SS=0023 ESP=0442BD28 EBP=0442BD60
: ECX=00000000 DS=0023 ESI=0045F2DC FS=003b
: EDX=00000300 ES=0023 EDI=028B1FE0 GS=0000

Stack Trace : 00454D13 FFFFFFFF 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000

Modules :
1 : 00400000 002A8000 c:\program files\metatrader 4\terminal.exe
2 : 03C10000 00006000 c:\program files\punto switcher\correct.dll.1206130071
3 : 03C20000 00035000 c:\windows\system32\btmmhook.dll
4 : 10000000 00071000 c:\program files\digitalpersona\bin\dpofeedb.dll
5 : 70520000 00038000 c:\windows\system32\odbcint.dll
6 : 70690000 00065000 c:\windows\system32\odbc32.dll
7 : 70700000 0011C000 c:\windows\system32\mfc42.dll
8 : 74120000 00066000 c:\windows\system32\audioeng.dll
9 : 741D0000 00007000 c:\windows\system32\midimap.dll
10 : 741E0000 00021000 c:\windows\system32\audioses.dll
11 : 74210000 000B7000 c:\windows\system32\propsys.dll
12 : 74360000 00015000 c:\windows\system32\msacm32.dll
13 : 74380000 00009000 c:\windows\system32\msacm32.drv
14 : 743C0000 00030000 c:\windows\system32\wdmaud.drv
15 : 74410000 00004000 c:\windows\system32\ksuser.dll
16 : 74C60000 00038000 c:\windows\system32\oleacc.dll
17 : 74CA0000 00033000 c:\windows\system32\winmm.dll
18 : 750C0000 00194000 c:\windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6000.16386_none_5d07289e07e1d100\comctl32.dll
19 : 75290000 0003F000 c:\windows\system32\uxtheme.dll
20 : 753D0000 00027000 c:\windows\system32\mmdevapi.dll
21 : 754C0000 0002D000 c:\windows\system32\wintrust.dll
22 : 75580000 00005000 c:\windows\system32\msimg32.dll
23 : 75650000 00006000 c:\windows\system32\wshtcpip.dll
24 : 75660000 00007000 c:\windows\system32\avrt.dll
25 : 75740000 00038000 c:\windows\system32\rsaenh.dll
26 : 759B0000 0003B000 c:\windows\system32\mswsock.dll
27 : 75C80000 000F1000 c:\windows\system32\crypt32.dll
28 : 75D80000 00014000 c:\windows\system32\mpr.dll
29 : 75DD0000 00012000 c:\windows\system32\msasn1.dll
30 : 76150000 0002C000 c:\windows\system32\apphelp.dll
31 : 761B0000 00014000 c:\windows\system32\secur32.dll
32 : 761D0000 0001E000 c:\windows\system32\userenv.dll
33 : 76310000 00007000 c:\windows\system32\psapi.dll
34 : 76320000 00009000 c:\windows\system32\lpk.dll
35 : 76330000 00ACE000 c:\windows\system32\shell32.dll
36 : 76E00000 0007D000 c:\windows\system32\usp10.dll
37 : 76E80000 00055000 c:\windows\system32\shlwapi.dll
38 : 76EE0000 000AA000 c:\windows\system32\msvcrt.dll
39 : 76F90000 00144000 c:\windows\system32\ole32.dll
40 : 770E0000 000C3000 c:\windows\system32\rpcrt4.dll
41 : 771B0000 000D8000 c:\windows\system32\kernel32.dll
42 : 772E0000 00127000 c:\windows\system32\urlmon.dll
43 : 77410000 00045000 c:\windows\system32\iertutil.dll
44 : 77460000 00003000 c:\windows\system32\normaliz.dll
45 : 77470000 0008C000 c:\windows\system32\oleaut32.dll
46 : 77500000 00029000 c:\windows\system32\imagehlp.dll
47 : 77530000 00189000 c:\windows\system32\setupapi.dll
48 : 776C0000 00006000 c:\windows\system32\nsi.dll
49 : 776D0000 000BF000 c:\windows\system32\advapi32.dll
50 : 77790000 000CF000 c:\windows\system32\wininet.dll
51 : 77860000 0009E000 c:\windows\system32\user32.dll
52 : 77900000 0001E000 c:\windows\system32\imm32.dll
53 : 77920000 00074000 c:\windows\system32\comdlg32.dll
54 : 779A0000 0002D000 c:\windows\system32\ws2_32.dll
55 : 779D0000 00084000 c:\windows\system32\clbcatq.dll
56 : 77A60000 0011E000 c:\windows\system32\ntdll.dll
57 : 77B80000 000C7000 c:\windows\system32\msctf.dll
58 : 77C50000 0004B000 c:\windows\system32\gdi32.dll

Call stack :
0045F260:34FF [0046275F] ?ExecuteStaticAsm@CExpertInterior (terminal.exe)
00454C00:0113 [00454D13] ?RunExpertInt@CExpertInterior (terminal.exe)



Когда работаю с композитным окном Windows Aero - появляются артифакты на графике очень редко в основном обрезает половину правой колонки цены.



Еще замечен глючок иногда не сохраняет последние открытые графики.

Пока всее что заметил

 

Дело не в висте а в 213 билде! Скачайте последний, 215 билд и обязательно перекомпилируйте Вашего эксперта.

Причина обращения: