vito333

Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору ShIvADeSt да в том то и дело, я для проверки спрашивал, сам я вижу, что одно и то же и в бреде и у меня. Существенный момент есть такой - бред большой файл начинает отображать еще и не загрузив полностью, у меня же только после полной практически загрузки - отсюда визуальная разница. http://vito.rbcmail.ru/Mark2.exe попробуй драг"н"дропом кинуть в эту прогу файл габаритный - в статбаре будут сообщения: "file was read" - файл считан в ReadFile-ом в буфер в памяти, "converted" - весь буфер конвертирован в юникод, "ready" - файл полностью загружен из буфера в ричедит. Так вот скорость загрузки в рич даже из памяти очень невысока. Правда ричедит юникодовый, но я сравнивал с обычным - разницы нет. Я проверил - загрузка в ричедит идет кусками по 4096 байт, итого на файле 26 мб - несколько десятков тыс. операций по 4096 б. Не могу понять, из памяти он медленнее грузится, что ли, чем с диска. Я перешел на юникодовый контрол, а посему мне напрямую загрузка не подходит - юникод так не реализуешь, все равно конвертить надо, а значит - буфер нужен. Попробую сейчас напрямую с диска в рич грузить, сравню, хотя я по-моему уже пробовал. Добавлено BOOL File_Load(LPCTSTR fullfilename) { EDITSTREAM es = {0}; HANDLE hfile; HWND hRTF,hwnd; DWORD bufSize, bytesReaded; PCHAR pBuf; LPDOC_INFO pDI; TCHAR fn[MAX_PATH]={0}; lstrcpy(fn,fullfilename); hfile = CreateFile(fullfilename,GENERIC_READ,0,0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); if (hfile == INVALID_HANDLE_VALUE) return FALSE; // готовим структуру ZeroMemory(&BufInfo,sizeof(BufInfo)); // получаем размер файла BufInfo.BufSize = bufSize = GetFileSize(hfile,0); // проверяем, годится ли текущее окно для загрузки документа? if (hwnd = hActiveMdiWnd()) { // получаем адрес структуры данных окна pDI = ptrWNDSTRUCT(hwnd); // есть активное мди-окно - проверяем его РТФ GETTEXTLENGTHEX tl; hRTF = hActiveRTF(hwnd); tl.flags = GTL_NUMCHARS; tl.codepage = CP_ACP; // если длина текста в РТФ != 0, то создаем новое окно if (SNDMSG(hRTF, EM_GETTEXTLENGTHEX, (WPARAM)&tl, 0)) { // создаем новое окно для открываемого файла hwnd = Child_Window_New((LPCTSTR)fn); }else{ // поправляем заголовок окна SetWindowText(hwnd,fn); // set new tab title Tab_ChangeTitle( mainTabBar.hTabBar,1111,fn); } } else // нет активного мди-окна { // создаем новое окно для открываемого файла hwnd = Child_Window_New((LPCTSTR)fn); // получаем адрес структуры данных окна pDI = ptrWNDSTRUCT(hwnd); } // вычисляем хэндл ричедита hRTF = hActiveRTF(hwnd);// di->hwnd_RTF; // готовим структуру для EM_STREAMIN es.dwCookie = (DWORD_PTR)hfile; es.pfnCallback = &LoadFileCallBack2; // загружаем файл long rtfmask = SendMessage (hRTF,EM_SETEVENTMASK,0,0); SNDMSG(hRTF, EM_STREAMIN,(WPARAM)(UINT)SetStreaminFlags(fn),(LPARAM)(EDITSTREAM FAR *) &es); SendMessage (hRTF,EM_SETEVENTMASK,0,rtfmask); // закрываем хэндл считанного файла CloseHandle(hfile); // ставим флаг, что файл не изменялся SNDMSG(hRTF, EM_SETMODIFY,(WPARAM)FALSE,(LPARAM)0); ToolBar_Buttons_SetState(hRTF); // сохраняем в список MRD MRD_save((LPTSTR)fn); return TRUE; } static DWORD CALLBACK LoadFileCallBack2(DWORD dwCookie, // application-defined value LPBYTE lpBuffer, // pointer to a buffer LONG lSize, // number of bytes to read or write LONG *plRead) // pointer to number of bytes transferred { if(!lSize) return 1; if(!ReadFile((HANDLE) dwCookie,lpBuffer, lSize, (LPDWORD) plRead, NULL)) return -1; return 0; } вот собсно загрузка в обычный ричедит контрол. на 26 мб файл тхт ~5-6 сек. |