C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Хранение файлов в БД  (Прочитано 43663 раз)
Kuks
Давний друг
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 54


« Ответ #60 : 07 октября 2009, 16:48:57 »

Спасибо, посмотрю
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #61 : 07 октября 2009, 17:20:27 »

просто напросто не надо принудительно убивать поток, а надо дождаться его завершения и все (при этом можно сделать видимость, того что прога закрылась и спрятать главное окно).
Либо по внешнему флагу прерывать цикл в потоке, тогда поток сам корректно завершится.
Записан
Kuks
Давний друг
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 54


« Ответ #62 : 08 октября 2009, 09:15:23 »

Да с потоком-то, на мой взгляд всё в порядке, он отрабатывает, все делает
как надо. После того как все потоки завершены, при закрытиии программы, она вылетает,
причем не всегда, выявить какую-либо закономерность не удается..
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #63 : 08 октября 2009, 09:24:09 »

вот эта конструкция:
Код
for (i = m_MyThread.begin(); i != m_MyThread.end(); i++)
           TerminateThread(i, 0);
 
может убить поток в любом месте, а тот в свою очередь убьет обекты из стека, но не убьет объекты из кучи - будет несогласованность доступа
Записан
Kuks
Давний друг
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 54


« Ответ #64 : 08 октября 2009, 09:27:49 »

Закомментировал кусок кода, касающийся векторов.
То же самое.

Все равно вылетает, щаз буду пробовать вообще свести по- минимуму или избавиться
от VCL в функции потока.
Записан
Kuks
Давний друг
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 54


« Ответ #65 : 08 октября 2009, 15:08:14 »

Убрал в функции  потока TFileStream.
Код
out_file = fopen(temp_dir,"w+");
       SendMessage(FileTableForm->Handle,wm_filesizethread,(WPARAM)BS->Size,0);
       for (int i = 0; i < BS->Size; i++)
       {
               BS->Position = i;
               BS->Read(&Buffer,1);
               fputs(&Buffer,out_file);
               SendMessage(FileTableForm->Handle,wm_progress,0,0);
       }
       delete BS;
       delete FileQuery;
       delete Data;
       fclose(out_file);

Перестали открываться файлы.
Вероятно, что TFileStream и TADOBlobStream наследники TStream,
поэтому TFileStream->Write корректно пишет Blob в файл.
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #66 : 08 октября 2009, 15:24:59 »

надо fopen открывать в бинарном режиме, а не в текстовом ("w+b" вроде флаги)
Записан
Kuks
Давний друг
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 54


« Ответ #67 : 08 октября 2009, 15:33:42 »

Пробовал, не помогает, причем при w+b, файл почему то получается в 6 раз больше,
и если открыть блокнотом, там полный бред.
Если просто "w+" размер отличаеся почему-то на несколько байт и соответственно ворд
говорит файл поврежден и т.д. и т.п.
При использовании TFileStream->Write все совпадает байт в байт и открывается на ура...
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #68 : 08 октября 2009, 16:40:40 »

вот так:
Код:
fopen (FileName, "wb");
должно работать
Записан
Kuks
Давний друг
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 54


« Ответ #69 : 08 октября 2009, 16:41:42 »

Переписал всё в WinAPI, всё работает на ура
Код
HANDLE H = CreateFile(temp_dir,
               GENERIC_WRITE,
               FILE_SHARE_WRITE,
               0,
               CREATE_ALWAYS,                                
               FILE_ATTRIBUTE_NORMAL,
               0);
       SendMessage(FileTableForm->Handle,wm_filesizethread,(WPARAM)BS->Size,0);
       for (int i = 0; i < BS->Size; i++)
       {
               BS->Position = i;
               BS->Read(&Buffer,1);
               WriteFile(H,&Buffer,1,&fWritten,NULL);
               SendMessage(FileTableForm->Handle,wm_progress,0,0);
       }
       delete BS;
       delete FileQuery;
       delete Data;
       CloseHandle(H);
Записан
Kuks
Давний друг
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 54


« Ответ #70 : 08 октября 2009, 16:42:32 »

wb не работает, пробовал, см. пост выше.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в: