шмеющимся на экране элементам отправляется слишком много сообщений, что может замедлять работу. В основном это касается случаев нахождения курсора мыши над панелью инструментов (самый критичный случай), также в поле предварительного просмотра и просто в диалогах. Нагрузка пропадает, если открыть дополнительное стандартное меню (например, в журнале или документе при нажатии кнопки, раскрывающейся в список).
Обнаружено, что непрерывно посылается WM_GETTEXT элементу Edit (строке поиска) =>1 0x7fa3f355 EditWndProc_common+0xac5(wParam=0x7fc0e204, lParam=0x7fc0e204, unicode=0x0) [/home/lav/Projects/wine/dlls/user/edit.c:900] in user32 (0x7fa3f355) 2 0x7fa40c3a EditWndProcA+0x1a(hWnd=0x10068, uMsg=0xd, wParam=0x2, lParam=0x7fc0e204) [/home/lav/Projects/wine/dlls/user/edit.c:1095] in user32 (0x7fa40c3a) 3 0x7fa88b6a WINPROC_wrapper+0x1a in user32 (0x7fa88b6a) 4 0x7fa89276 call_window_proc+0x66(hwnd=0x10068, msg=0xd, wp=0x2, lp=0x7fc0e204, result=0x7fc0dc28, arg=0x7fa40c20) [/home/lav/Projects/wine/dlls/user/winproc.c:452] in user32 (0x7fa89276) 5 0x7fa8caa6 CallWindowProcA+0x46(func=0x7fa40c20, hwnd=0x10068, msg=0xd, wParam=0x2, lParam=0x7fc0e204) [/home/lav/Projects/wine/dlls/user/winproc.c:2227] in user32 (0x7fa8caa6) 6 0x6c2920f2 in mfc42 (+0x20f2) (0x6c2920f2) 7 0x6c291d01 in mfc42 (+0x1d01) (0x6c291d01) 8 0x6c291c73 in mfc42 (+0x1c73) (0x6c291c73) 9 0x6c291bfb in mfc42 (+0x1bfb) (0x6c291bfb) 10 0x6c291bba in mfc42 (+0x1bba) (0x6c291bba) 11 0x7fa88b6a WINPROC_wrapper+0x1a in user32 (0x7fa88b6a) 12 0x7fa89276 call_window_proc+0x66(hwnd=0x10068, msg=0xd, wp=0x2, lp=0x7fc0e204, result=0x7fc0e460, arg=0x6c291b81) [/home/lav/Projects/wine/dlls/user/winproc.c:452] in user32 (0x7fa89276) 13 0x7fa8d4ef WINPROC_CallProcWtoA+0x94f(wParam=0x2, lParam=0x7fda25e8, result=0x7fc0e460, arg=0x6c291b81) [/home/lav/Projects/wine/dlls/user/winproc.c:1093] in user32 (0x7fa8d4ef) 14 0x7fa8d9a7 CallWindowProcW+0x97(func=0xffff0025, hwnd=0x10068, msg=0xd, wParam=0x2, lParam=0x7fda25e8) [/home/lav/Projects/wine/dlls/user/winproc.c:2254] in user32 (0x7fa8d9a7) 15 0x7fa5d49e call_window_proc+0x13e(hwnd=<register not in topmost frame>, lparam=0x7fda25e8, unicode=0x1, same_thread=0x1) [/home/lav/Projects/wine/dlls/user/message.c:1536] in user32 (0x7fa5d49e) 16 0x7fa614b6 SendMessageTimeoutW+0x176(hwnd=0x10068, msg=0xd, wparam=0x2, lparam=0x7fda25e8, flags=0x0, timeout=0x0, res_ptr=0x7fc0e574) [/home/lav/Projects/wine/dlls/user/message.c:2372] in user32 (0x7fa614b6) 17 0x7fa61507 SendMessageW+0x37(hwnd=0x10068, msg=0xd, wparam=0x2, lparam=0x7fda25e8) [/home/lav/Projects/wine/dlls/user/message.c:2458] in user32 (0x7fa61507) 18 0x7fa805cc GetWindowTextW+0x3c(hwnd=0x10068, lpString=0x7fda25e8, nMaxCount=0x2) [/home/lav/Projects/wine/dlls/user/win.c:2395] in user32 (0x7fa805cc) 19 0x7fa1d7b2 CBUpdateLBox+0x142 [/home/lav/Projects/wine/dlls/user/combo.c:1022] in user32 (0x7fa1d7b2) 20 0x7fa1e09f COMBO_Command+0x26f(lphc=<register not in topmost frame>, wParam=<register not in topmost frame>, hWnd=<register not in topmost frame>) [/home/lav/Projects/wine/dlls/user/combo.c:1345] in user32 (0x7fa1e09f) 21 0x7fa1f807 ComboWndProc_common+0x16d7(hwnd=<register not in topmost frame>, message=<register not in topmost frame>, lParam=0x10068, unicode=0x0) [/home/lav/Projects/wine/dlls/user/combo.c:1974] in user32 (0x7fa1f807) 22 0x7fa20d0b ComboWndProcA+0x3b(hwnd=0x10064, message=0x111, wParam=0x30003e9, lParam=0x10068) [/home/lav/Projects/wine/dlls/user/combo.c:2338] in user32 (0x7fa20d0b) 23 0x7fa88b6a WINPROC_wrapper+0x1a in user32 (0x7fa88b6a) 24 0x7fa89276 call_window_proc+0x66(hwnd=0x10064, msg=0x111, wp=0x30003e9, lp=0x10068, result=0x7fc0e7dc, arg=0x7fa20cd0) [/home/lav/Projects/wine/dlls/user/winproc.c:452] in user32 (0x7fa89276) 25 0x7fa8caa6 CallWindowProcA+0x46(func=0x7fa20cd0, hwnd=0x10064, msg=0x111, wParam=0x30003e9, lParam=0x10068) [/home/lav/Projects/wine/dlls/user/winproc.c:2227] in user32 (0x7fa8caa6) 26 0x6c2920f2 in mfc42 (+0x20f2) (0x6c2920f2) 27 0x6c291d01 in mfc42 (+0x1d01) (0x6c291d01) 28 0x6c291c73 in mfc42 (+0x1c73) (0x6c291c73) 29 0x6c291bfb in mfc42 (+0x1bfb) (0x6c291bfb) 30 0x6c291bba in mfc42 (+0x1bba) (0x6c291bba) 31 0x7fa88b6a WINPROC_wrapper+0x1a in user32 (0x7fa88b6a) 32 0x7fa89276 call_window_proc+0x66(hwnd=0x10064, msg=0x111, wp=0x30003e9, lp=0x10068, result=0x7fc0f014, arg=0x6c291b81) [/home/lav/Projects/wine/dlls/user/winproc.c:452] in user32 (0x7fa89276) 33 0x7fa8ccd9 WINPROC_CallProcWtoA+0x139(wParam=0x30003e9, lParam=0x10068, result=0x7fc0f014, arg=0x6c291b81) [/home/lav/Projects/wine/dlls/user/winproc.c:1127] in user32 (0x7fa8ccd9) 34 0x7fa8d9a7 CallWindowProcW+0x97(func=0xffff0025, hwnd=0x10064, msg=0x111, wParam=0x30003e9, lParam=0x10068) [/home/lav/Projects/wine/dlls/user/winproc.c:2254] in user32 (0x7fa8d9a7) 35 0x7fa5d49e call_window_proc+0x13e(hwnd=<register not in topmost frame>, lparam=0x10068, unicode=0x1, same_thread=0x1) [/home/lav/Projects/wine/dlls/user/message.c:1536] in user32 (0x7fa5d49e) 36 0x7fa614b6 SendMessageTimeoutW+0x176(hwnd=0x10064, msg=0x111, wparam=0x30003e9, lparam=0x10068, flags=0x0, timeout=0x0, res_ptr=0x7fc0f128) [/home/lav/Projects/wine/dlls/user/message.c:2372] in user32 (0x7fa614b6) 37 0x7fa61507 SendMessageW+0x37(hwnd=0x10064, msg=0x111, wparam=0x30003e9, lparam=0x10068) [/home/lav/Projects/wine/dlls/user/message.c:2458] in user32 (0x7fa61507) 38 0x7fa3cc0e EDIT_EM_ReplaceSel+0x1ce(es=<register not in topmost frame>, send_update=0x1, honor_limit=0x1) [/home/lav/Projects/wine/dlls/user/edit.c:3364] in user32 (0x7fa3cc0e) 39 0x7fa3e1c8 EDIT_WM_Char+0x78(es=<register not in topmost frame>, c=<register not in topmost frame>) [/home/lav/Projects/wine/dlls/user/edit.c:4041] in user32 (0x7fa3e1c8) 40 0x7fa3ee9f EditWndProc_common+0x60f(wParam=<register not in topmost frame>, lParam=0x20001, unicode=0x0) [/home/lav/Projects/wine/dlls/user/edit.c:838] in user32 (0x7fa3ee9f) 41 0x7fa40c3a EditWndProcA+0x1a(hWnd=0x10068, uMsg=0x102, wParam=0x21, lParam=0x20001) [/home/lav/Projects/wine/dlls/user/edit.c:1095] in user32 (0x7fa40c3a) 42 0x7fa88b6a WINPROC_wrapper+0x1a in user32 (0x7fa88b6a) 43 0x7fa89276 call_window_proc+0x66(hwnd=0x10068, msg=0x102, wp=0x21, lp=0x20001, result=0x7fc0f350, arg=0x7fa40c20) [/home/lav/Projects/wine/dlls/user/winproc.c:452] in user32 (0x7fa89276) 44 0x7fa8caa6 CallWindowProcA+0x46(func=0x7fa40c20, hwnd=0x10068, msg=0x102, wParam=0x21, lParam=0x20001) [/home/lav/Projects/wine/dlls/user/winproc.c:2227] in user32 (0x7fa8caa6) 45 0x6c2920f2 in mfc42 (+0x20f2) (0x6c2920f2) 46 0x6c291d01 in mfc42 (+0x1d01) (0x6c291d01) 47 0x6c291c73 in mfc42 (+0x1c73) (0x6c291c73) 48 0x6c291bfb in mfc42 (+0x1bfb) (0x6c291bfb) 49 0x6c291bba in mfc42 (+0x1bba) (0x6c291bba) 50 0x7fa88b6a WINPROC_wrapper+0x1a in user32 (0x7fa88b6a) 51 0x7fa89276 call_window_proc+0x66(hwnd=0x10068, msg=0x102, wp=0x21, lp=0x20001, result=0x7fc0fb88, arg=0x6c291b81) [/home/lav/Projects/wine/dlls/user/winproc.c:452] in user32 (0x7fa89276) 52 0x7fa8ccd9 WINPROC_CallProcWtoA+0x139(wParam=0x21, lParam=0x20001, result=0x7fc0fb88, arg=0x6c291b81) [/home/lav/Projects/wine/dlls/user/winproc.c:1127] in user32 (0x7fa8ccd9) 53 0x7fa8d9a7 CallWindowProcW+0x97(func=0xffff0025, hwnd=0x10068, msg=0x102, wParam=0x21, lParam=0x20001) [/home/lav/Projects/wine/dlls/user/winproc.c:2254] in user32 (0x7fa8d9a7) 54 0x7fa5d8f5 DispatchMessageW+0x155(msg=0x7fc0fd5c) [/home/lav/Projects/wine/dlls/user/message.c:3040] in user32 (0x7fa5d8f5) 55 0x7fa32f61 IsDialogMessageW+0xf1(hwndDlg=0x10056, msg=0x7fc0fd5c) [/home/lav/Projects/wine/dlls/user/dialog.c:1190] in user32 (0x7fa32f61) 56 0x7fa5d610 IsDialogMessageA+0x40(hwndDlg=0x10056, pmsg=0x43611c) [/home/lav/Projects/wine/dlls/user/message.c:2873] in user32 (0x7fa5d610) 57 0x6c2a690f in mfc42 (+0x1690f) (0x6c2a690f) 58 0x6c291448 in mfc42 (+0x1448) (0x6c291448) 59 0x00000102 (0x00000102) 60 0x00000000 (0x00000000) 0x7fa3f355 EditWndProc_common+0xac5 [/home/lav/Projects/wine/dlls/user/edit.c:900] in user32: movb $0x0,0x00000000 900 t=0,*t=0;
Это только при показе окна с новостями
При простое длинный цикл таких сообщений: GET:swqrsafx GET:swqrsafx trace:tab:TAB_WindowProc hwnd=0x501b0 msg=363 wParam=1 lParam=0 trace:tab:TAB_WindowProc hwnd=0x501b0 msg=363 wParam=1 lParam=0 trace:tab:TAB_WindowProc hwnd=0x30206 msg=130c wParam=0 lParam=0 trace:tab:TAB_SetCurSel infoPtr=0x7d7c4968, iSelected=0, iItem=0, uNumItem=1 trace:tab:TAB_WindowProc hwnd=0x30206 msg=363 wParam=1 lParam=0 GET:swqrsafx GET:swqrsafx trace:tab:TAB_WindowProc hwnd=0x501b0 msg=363 wParam=1 lParam=0 trace:tab:TAB_WindowProc hwnd=0x501b0 msg=363 wParam=1 lParam=0 trace:tab:TAB_WindowProc hwnd=0x30206 msg=130c wParam=0 lParam=0 trace:tab:TAB_SetCurSel infoPtr=0x7d7c4968, iSelected=0, iItem=0, uNumItem=1 trace:tab:TAB_WindowProc hwnd=0x30206 msg=363 wParam=1 lParam=0
trace:edit:EditWndProc_common hwnd=0x8021e msg=e (WM_GETTEXTLENGTH) -- 0x00000008 trace:edit:EditWndProc_common hwnd=0x8021e msg=d (WM_GETTEXT) wparam=9 lparam=7e2e9e30 GET:swqrsafx trace:edit:EditWndProc_common hwnd=0x8021e msg=d (WM_GETTEXT) -- 0x00000008 trace:edit:EditWndProc_common hwnd=0x8021e msg=e (WM_GETTEXTLENGTH) wparam=0 lparam=0 trace:edit:EditWndProc_common hwnd=0x8021e msg=e (WM_GETTEXTLENGTH) -- 0x00000008 trace:edit:EditWndProc_common hwnd=0x8021e msg=d (WM_GETTEXT) wparam=9 lparam=7e2e9e30 GET:swqrsafx trace:edit:EditWndProc_common hwnd=0x8021e msg=d (WM_GETTEXT) -- 0x00000008 trace:edit:EditWndProc_common hwnd=0x8021e msg=363 (WM_IDLEUPDATECMDUI) wparam=1 lparam=0 trace:edit:EditWndProc_common hwnd=0x8021e msg=363 (WM_IDLEUPDATECMDUI) -- 0x00000000 trace:edit:EditWndProc_common hwnd=0x701a6 msg=363 (WM_IDLEUPDATECMDUI) wparam=1 lparam=0 trace:edit:EditWndProc_common hwnd=0x701a6 msg=363 (WM_IDLEUPDATECMDUI) -- 0x00000000 trace:edit:EditWndProc_common hwnd=0x8021e msg=e (WM_GETTEXTLENGTH) wparam=0 lparam=0 trace:edit:EditWndProc_common hwnd=0x8021e msg=e (WM_GETTEXTLENGTH) -- 0x00000008 trace:edit:EditWndProc_common hwnd=0x8021e msg=d (WM_GETTEXT) wparam=9 lparam=7e2e9e30 GET:swqrsafx trace:edit:EditWndProc_common hwnd=0x8021e msg=d (WM_GETTEXT) -- 0x00000008 trace:edit:EditWndProc_common hwnd=0x8021e msg=e (WM_GETTEXTLENGTH) wparam=0 lparam=0 trace:edit:EditWndProc_common hwnd=0x8021e msg=e (WM_GETTEXTLENGTH) -- 0x00000008 trace:edit:EditWndProc_common hwnd=0x8021e msg=d (WM_GETTEXT) wparam=9 lparam=7e2e9e30
trace:edit:EditWndProc_common hwnd=0xa0222 msg=363 (WM_IDLEUPDATECMDUI) wparam=1 lparam=0 trace:edit:EditWndProc_common hwnd=0xa0222 msg=363 (WM_IDLEUPDATECMDUI) -- 0x00000000 trace:edit:EditWndProc_common hwnd=0x90220 msg=363 (WM_IDLEUPDATECMDUI) wparam=1 lparam=0 trace:edit:EditWndProc_common hwnd=0x90220 msg=363 (WM_IDLEUPDATECMDUI) -- 0x00000000 trace:combo:ComboWndProc_common [0x8019c]: msg WM_IDLEUPDATECMDUI wp 00000001 lp 00000000 trace:combo:ComboWndProc_common [0x801ba]: msg WM_GETDLGCODE wp 00000000 lp 00000000 trace:combo:ComboWndProc_common [0x801ba]: msg WM_IDLEUPDATECMDUI wp 00000001 lp 00000000
Буду смотреть. Это сообщение отправляется во время ожидания в MFC (idle time) и проверяет - надо ли что-то обновлять или нет. В вайн это делается слишком часто и отправляется для всех вайнов.Что даёт очень большой поток сообщений. Это сообщение в вайн нигде не отправляется, соответственно эти сообщения генерит программа (1с), я думаю, что она это делает для то чтобы расставлять приорететы сообщениям через переопределение OnIdle. Ссылки : http://www.firststeps.ru/mfc/steps/help/r.php?43
Есть такая штука в 1С, как встроенный метод ПриВыборе (или что-то такое) - это когда если ты его определишь, то курсор на клетках Таблиц становится лупой. Как мы уже выяснили ранее, оно отгребает примерно столько же CPU, сколько наведение курсора на иконку. НО - если иконки сыпят сообщении только если их окно активно, то Таблицы, судя по всему - всегда. И - если полос иконок не больше, чем открытых 1С (а это не много), то открытых Таблиц может быть много.
Средняя загрузка сервера при 5 1с: wineserver:12-16 % (в холодном режиме) в 1С при наведении курсора на rebar:19-20 % (при условии, что в холодном режиме 1С берёт 4-5 %)
Выявлены следующие соотношения: Посылается большое количество сообщений (в win при наведении на картинку rebar при активном фокусе – 3 WM_TIMER и 2 WM_NCHITTEST ; в linux при тех же условиях – 1 WM_TIMER и разное количество WM_NCHITTEST 2, но обычно 4–5.
Исключил повторяющиеся последовательности.Загрузка упала ~ на 10%
Наверное Константин это давно не получает
"если открыть в 1С Таблицу с контекстной чувствительностью (лупа), то на P4-1.8 CPU становится в 14%. Потом можно хоть 10-20 таблиц еще открыть - поднимается до 15-16% - независимо от свернутости/развернутости 1С. У бухгалтеров же та же операция загоняет Xeon 3.2 в 60..80%. возможно это из-за того, что они работают в терминалах. Т.е. обмолот вызовов winapi X-клинто для отсылки удаленному x-серверу стоит значительно больших нервов, чем локальному."
Как показали измерения Паши, сообщения при этом крутятся внутри процесса, не доходя до wineserver. Также стало известно, что огромное количество запросов к серверу формируется функциями get_window_children и get_window_tree, которые вызываются до миллиона раз в минуту. Принятно решение их кэшировать. Как показали наблюдения Коли, такой же поток сообщений существует и в Windows. Поэтому мы пошли по пути оптимизации обработки.
попробуйте постоянно двигать мышкой в окне 1с даже пустом загрузка проца 100%
Итак, создана кэширующая прослойка обращений к серверу. Это существенно снизило межпроцессное взаимодействие. Далее на WM_IDLEUPDATECMDUI поставлена задержка, которая вызывает переключение контекста и нормализует загрузку. Решение не окончательное, требует детализации и измерений. К релизу готово, нужно тестировать.
Для исправления 2726 таймер на процедуру, с id=0, временем 200 сокращён до 500мс.
2611, а не 2726