Диагностика проблемы медленной записи

Поэтому я надеюсь, что кто-то может помочь мне с этим вопросом, который может показаться очевидным любому, имеющему опыт программирования, но не мне! Пожалуйста, извините за мои плохие описания, так как я не знаю правильной терминологии для многих вещей.

По сути, я унаследовал проект, используя старый (ish) компьютер, на котором установлена ​​карта framegrabber (Matrox Meteor II). Моя основная цель - просто захватывать видео в реальном времени с камеры и записывать его без сжатия на жесткий диск компьютера. Программирование для карты выполняется на C и использует библиотеку, которая поставляется в комплекте с ней, называется Matrox Imaging Library (MIL).

В настоящее время я просто пишу все мои изображения в виде битового массива и использую imageJ для их просмотра. Я написал базовую программу, которая использует двойную буферизацию, поэтому изображение записывается в буфер, а затем записывается в текстовый файл, а следующее изображение записывается в другой буфер. Ниже я приведу фрагмент кода, все команды M-префикса взяты из библиотеки MIL. Однако вам не нужно понимать их, чтобы помочь мне.

Я просто использую следующее:

/* Put the digitizer in asynchronous mode. */
MdigControl(MilDigitizer, M_GRAB_MODE, M_ASYNCHRONOUS);

/* Grab the first buffer. */
MdigGrab(MilDigitizer, MilImage[0]);

/*open my file where I will write the images*/
pfile = fopen("myfile.txt", "wb");

/* Process one buffer while grabbing the other. */
while( !kbhit() )
  {

  /* Grab second buffer while processing first buffer. */
  MdigGrab(MilDigitizer, MilImage[1]);

  /* Synchronize and start the timer. */
  if (NbProc == 0)
     {
     MappTimer(M_TIMER_RESET, M_NULL);
     }

  /* Process the first buffer already grabbed.  */

  /*copy the image to a display buffer*/
  #if COPY_IMAGE 
  MbufCopy(MilImage[0], MilImageDisp);
  #endif      

  /*Here we copy the buffer into a user supplied array*/
  MbufGet(MilImage[0], my_array);

  /* Then we write the array into the text file using fwrite*/
  fwrite(my_array,sizeof(char),sizeof(my_array),pfile);

    /*Output the amount of time it took to process that image*/
    MappTimer(M_TIMER_READ, &Time);
Capture_Time = Time - Time_Holder;
printf("IMG %s took %.7f .\n", text, Capture_Time);
Time_Holder = Time;
    /* Count processed buffers.  */
     NbProc++;         


  /* Grab first buffer while processing second buffer. */
  MdigGrab(MilDigitizer, MilImage[0]);

  /* Process the second buffer already grabbed.  */

  #if COPY_IMAGE 
  MbufCopy(MilImage[1], MilImageDisp);
  #endif      




  /*Here we copy the buffer into our array*/
  MbufGet(MilImage[1], my_array);

  /* Then we write the array into the text file using fwrite*/
  fwrite(my_array,sizeof(char),sizeof(my_array),pfile);

  MappTimer(M_TIMER_READ, &Time);
Capture_Time = Time - Time_Holder;
printf("IMG %s took %.7f .\n", text, Capture_Time);
Time_Holder = Time;


  /* Count processed buffers. */
  NbProc++;         
  }
  getchar();   
   /* Wait last grab end and stop timer. */
   MdigGrabWait(MilDigitizer, M_GRAB_END);

   /*Close our file*/
   fclose(pfile);

Моя проблема в том, что я хотел бы делать вышеизложенное с частотой кадров 24 кадра в секунду, но я обнаружил, что процесс захвата изображений и их записи на жесткий диск несколько медленнее, чем это иногда (замедление не согласовано, но программа кажется иногда зависать на одном кадре в течение ~500 мс).

Мне было интересно, знает ли кто-нибудь о способе диагностики причин этих замедлений и о том, может ли это быть скорость записи моего жесткого диска.

1 ответ

Это поможет вам исправить случайное зависание в одном кадре, включив кэширование записи на диск. Вы можете перейти в C: диск-> Свойства-> Оборудование-> Выбрать диск-> Свойства диска-> Политики-> Включить кэширование записи на устройстве.

Другая модификация, которая может быть выполнена в коде, соответствует первой строке вашего кода, где вы переводите дигитайзер в режим ASYNCHRONOUS вместо того, чтобы использовать MdigControl(milDigitizer,M_GRAB_MODE,M_ASYNCHRONOUS_QUEUED); Это будет продолжаться после того, как каждый захват будет поставлен в очередь, и не будет ждать завершения функции захвата Mil.

Другие вопросы по тегам