Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Content plugin - странная работа функции ContentGetValue 
Author Message
MVV



PostPosted: Tue Jul 13, 2010 16:08    Post subject: Reply with quote

А ты не забывай про фоновый подсчет содержимого поля - ты сам должен сказать ТК, что поле можно подсчитать в фоне:
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…
View user's profile Send private message ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group