?
Hotze schrieb:
Könnte es daran liegen das der Framegrabber kontinuierlich Bilder in den Arbeitsspeicher lädt und ich diese zeitgleich auslesen will? Aber das würde ja auch nicht erklären warum das Abspeichern als Textdatei 4 mal so schnell geht
nicht wahr? das seltsame ist ja, dass ein 'fwrite', dass eigentlich mehr macht, als es muss, dafür sorgt, dass der gesamte vorgang schneller ist, als mit schnelleren 'fwrites'.
Hotze schrieb:
do{
pic_nr = Fg_getLastPicNumber(fg,0);
}while(pic_nr==pic_nr_old);
Aber in die Warteschleife komme ich normal gar nicht (außer bei sehr kleinen Framerates), da das Abspeichern der Bilder zu lange dauert.
trotzdem doof. hier verbrätst du rechenzeit, die der framegrabber brauchen könnte. füg in die schleife wenigstens ein 'Sleep(1)' ein, damit der scheduler zum nächsten thread schaltet.
Hotze schrieb:
FILE fp;
do{
sprintf_s(filename, "d:\\Photonfocus_cam\\Buffer\\buffer%06d.raw", i);
fp = fopen(filename,"wb");
setbuf (fp,NULL);
fwrite(image_ptr, 1, height*width*nr_of_buffer2, fp);
fclose(fp);
i++;
}while(i<nb_frame);
der code passt irgendwie nicht zu dem, was du erzählst. wenn der framegrabber asynchron arbeitet, wie kannst du sicher sein, dass eine komplette datei geschrieben wird?
folgender vorschlag:
- benutz einen 'lock free' FIFO, etwa den: http://www.koders.com/c/fidA649E1A0EA070488C13F29677B14D7C09E3E0187.aspx
- lass den framegrabber daten reinschreiben
- mach die 'fwrite'-schleife etwa so (für eine datei):
FILE *fp = fopen (...);
int bytes_written = 0;
char buff[2048]; // <-- 2048 grösse als beispiel
while (bytes_written < FRAMESIZE) // solange ein frame noch nicht voll ist
{
if (fifo_not_empty) // wenn framegrabber daten erzeugt hat...
{
int bytes_read = fifo_get (buff, sizeof(buff)); // <-- so viel wie möglich holen
fwrite (buff, 1, bytes_read, fp); // in datei schreiben
bytes_written += bytes_read; // mitzählen
}
else
{
Sleep(0); // <-- wenn nichts zu tun ist dann CPU abgeben
}
}
fclose (fp);
^^ nur so als beispiel, klappt, wenn das schreiben schneller geht als der grabber den fIFO füllt. ansonsten musste den grabber anhalten bzw. frames wegwerfen (je nachdem was besser passt).