MVV
|
Posted: Tue Jul 13, 2010 16:08 Post subject: |
|
|
А ты не забывай про фоновый подсчет содержимого поля - ты сам должен сказать ТК, что поле можно подсчитать в фоне:
Code: | if (Flags&CONTENT_DELAYIFSLOW) return ft_delayed; |
При этом все поля, при первом обращении к которым было возвращено ft_delayed, будут повторно запрошены в фоне (но уже без флага CONTENT_DELAYIFSLOW), позволяя работу с панелью до завершения заполнения колонок. Разумеется, если поле отвечает за сортировку, это поле будет запрошено в основном потоке в любом случае (флага CONTENT_DELAYIFSLOW не будет сразу).
И не забывай о синхронизации потоков, если используешь кэширование или другие глобальные переменные, совместный доступ к которым чреват глюками.
В моем тестовом плагине я добавил упомянутую выше строчку в начале функции ContentGetValueW, чтобы сделать все свои поля фоновыми, а потом поставил Sleep(256). Таким образом, на подсчет значения каждого поля уходит более 256 мс. И очень хорошо видно, что, пока тотал запрашивает значения сортировочного столбца, он висит, а значения в остальных столбцах появляются потом постепенно.
Code: | int __stdcall ContentGetValueW(WCHAR* FileName, int FieldIndex, int UnitIndex, void* FieldValue, int MaxLen, int Flags) {
if (FieldIndex>=IF_END) return ft_nosuchfield;
int error=0;
if (Flags&CONTENT_DELAYIFSLOW) return ft_delayed;
++counter;
Sleep(256);
switch (Fields[FieldIndex].Type) {
case ft_numeric_32: {
*(int*)FieldValue=counter;
break;
}
case ft_string: {
wsprintfA((char*)FieldValue, "%d", counter);
break;
}
case ft_stringw: {
wsprintfW((wchar_t*)FieldValue, L"%d", counter);
break;
}
default: {
error=ft_fieldempty;
}
}
return error ? error : Fields[FieldIndex].Type;
} |
_________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|