скачивание файла и мониторинг скорости
и смотрю скорость закачки методом OnWork()
TDateTime timeStartFile, timeFinishBlock;
__int64 bytesOfFile;
//---------------------------------------------------------------------------
__fastcall TformIdhttp::TformIdhttp(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TformIdhttp::btnGetClick(TObject *Sender)
{
String strUrl = lbedUrl->Text;
String strPath = lbedPath->Text;
String strSpeed;
__int64 timeForFile;
TFileStream *fs = new TFileStream(strPath, fmCreate, fmShareDenyNone);
idhttpTest->Get(strUrl, fs);
delete fs; //fs->Free();
timeForFile = MilliSecondsBetween(timeFinishBlock, timeStartFile);
strSpeed = FormatFloat("'average speed is: '0.00' KB/s'", bytesOfFile*1000/timeForFile/1024);
statIndy->SimpleText = strSpeed;
}
//---------------------------------------------------------------------------
void __fastcall TformIdhttp::idhttpTestWorkBegin(TObject *ASender, TWorkMode AWorkMode,
__int64 AWorkCountMax)
{
if (AWorkMode == wmRead) {
timeStartFile = timeFinishBlock = Now();
bytesOfFile = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TformIdhttp::idhttpTestWork(TObject *ASender, TWorkMode AWorkMode,
__int64 AWorkCount)
{
if (AWorkMode == wmRead) {
__int64 timeForBlock = MilliSecondsBetween(Now(), timeFinishBlock);
if (timeForBlock > 0) {
double bytesInBlock = AWorkCount - bytesOfFile;
String s;
if( bytesInBlock >= 1048576.0 )
s = FormatFloat("0.00' MB/s'", (bytesInBlock*1000/1048576.0)/timeForBlock);
else if( bytesInBlock >= 1024.0 )
s = FormatFloat("0.00' KB/s'", (bytesInBlock*1000/1024.0)/timeForBlock);
else
s = FormatFloat("0.00' B/s'", bytesInBlock*1000/timeForBlock);
statIndy->SimpleText = s;
lstReply->Items->Add(s);
Application->ProcessMessages();
}
bytesOfFile = AWorkCount;
timeFinishBlock = Now();
}
}
использовал инфу с этого форума:
http://forum.codenet.ru/showpost.php?p=124518&postcount=3
и с форума codegear:
https://forums.codegear.com/thread.jspa?threadID=18812
собственно, всё работает, и даже скорость, вроде, правильно показывает,
но при закрытии программы выдаёт:
гляньте, ато я запарился ужо
по-идее, засада должна лежать где-то на поверхности:
то же самое происходит, если я использую функцию
URLDownloadToFile()
то есть, всё скачивается зашибенско,
но при выходе из программы - "accsess violation..."
можт, я что-то не закрываю?
мне кажется, косяк буквально в этих трёх строчках:
idhttpTest->Get(strUrl, fs);
delete fs;
Возможно ты удаляешь указатель на файловый поток - а он в это время используется.
Возможно ты удаляешь указатель на файловый поток - а он в это время используется.
выскакивает окно:
project ...\....... faulted with message: 'accsess violation at ... read of address ... process stopped use step or run to continue'
(выскакивает он только при попытке закрыть программу; скачивание файла, мониторинг текущей и средней скорости отрабатывают нормально; более того - можно скачать несколько файлов, и всё - ок, но стоит закрыть программу - ошибка)
при этом компиллятор выбрасывает в окно cpu - там адреса памяти, напротив них - знаки вопроса
при этом debugger пишет:
Process Start: D:\#docs\prog\cpp\idhttp_test\Debug\idhttp_proj.exe. Base Address: $00400000. Process idhttp_proj.exe (5244)
Module Load: idhttp_proj.exe. Has Debug Info. Base Address: $00400000. Process idhttp_proj.exe (5244)
Module Load: ntdll.dll. No Debug Info. Base Address: $7C900000. Process idhttp_proj.exe (5244)
Module Load: KERNEL32.dll. No Debug Info. Base Address: $7C800000. Process idhttp_proj.exe (5244)
Module Load: rtl120.bpl. No Debug Info. Base Address: $50000000. Process idhttp_proj.exe (5244)
Module Load: OLEAUT32.dll. No Debug Info. Base Address: $77110000. Process idhttp_proj.exe (5244)
Module Load: msvcrt.dll. No Debug Info. Base Address: $77C00000. Process idhttp_proj.exe (5244)
Module Load: USER32.dll. No Debug Info. Base Address: $77D30000. Process idhttp_proj.exe (5244)
Module Load: GDI32.dll. No Debug Info. Base Address: $77F10000. Process idhttp_proj.exe (5244)
Module Load: ADVAPI32.dll. No Debug Info. Base Address: $77DC0000. Process idhttp_proj.exe (5244)
Module Load: RPCRT4.dll. No Debug Info. Base Address: $77E70000. Process idhttp_proj.exe (5244)
Module Load: Secur32.dll. No Debug Info. Base Address: $77FE0000. Process idhttp_proj.exe (5244)
Module Load: ole32.dll. No Debug Info. Base Address: $774D0000. Process idhttp_proj.exe (5244)
Module Load: VERSION.dll. No Debug Info. Base Address: $77BF0000. Process idhttp_proj.exe (5244)
Module Load: MPR.dll. No Debug Info. Base Address: $71B00000. Process idhttp_proj.exe (5244)
Module Load: IMAGEHLP.dll. No Debug Info. Base Address: $76C80000. Process idhttp_proj.exe (5244)
Module Load: WSOCK32.dll. No Debug Info. Base Address: $71AB0000. Process idhttp_proj.exe (5244)
Module Load: WS2_32.dll. No Debug Info. Base Address: $71A90000. Process idhttp_proj.exe (5244)
Module Load: WS2HELP.dll. No Debug Info. Base Address: $71A80000. Process idhttp_proj.exe (5244)
Module Load: OLEACC.dll. No Debug Info. Base Address: $74C40000. Process idhttp_proj.exe (5244)
Module Load: MSVCP60.dll. No Debug Info. Base Address: $76050000. Process idhttp_proj.exe (5244)
Module Load: vcl120.bpl. No Debug Info. Base Address: $50120000. Process idhttp_proj.exe (5244)
Module Load: MSIMG32.dll. No Debug Info. Base Address: $76350000. Process idhttp_proj.exe (5244)
Module Load: COMCTL32.dll. No Debug Info. Base Address: $773C0000. Process idhttp_proj.exe (5244)
Module Load: SHLWAPI.dll. No Debug Info. Base Address: $77F60000. Process idhttp_proj.exe (5244)
Module Load: SHELL32.dll. No Debug Info. Base Address: $7C9C0000. Process idhttp_proj.exe (5244)
Module Load: comdlg32.dll. No Debug Info. Base Address: $76380000. Process idhttp_proj.exe (5244)
Module Load: WINSPOOL.DRV. No Debug Info. Base Address: $72FC0000. Process idhttp_proj.exe (5244)
Module Load: oledlg.dll. No Debug Info. Base Address: $7DFC0000. Process idhttp_proj.exe (5244)
Module Load: IndyCore120.bpl. No Debug Info. Base Address: $00330000. Process idhttp_proj.exe (5244)
Module Load: IndySystem120.bpl. No Debug Info. Base Address: $00390000. Process idhttp_proj.exe (5244)
Module Load: IndyProtocols120.bpl. No Debug Info. Base Address: $00420000. Process idhttp_proj.exe (5244)
Module Load: borlndmm.dll. No Debug Info. Base Address: $20FF0000. Process idhttp_proj.exe (5244)
Module Load: cc3290mt.dll. No Debug Info. Base Address: $32900000. Process idhttp_proj.exe (5244)
Module Load: APSHook.dll. No Debug Info. Base Address: $10000000. Process idhttp_proj.exe (5244)
Module Load: IMM32.dll. No Debug Info. Base Address: $76360000. Process idhttp_proj.exe (5244)
Module Load: UxTheme.dll. No Debug Info. Base Address: $5B260000. Process idhttp_proj.exe (5244)
Module Load: MSCTF.dll. No Debug Info. Base Address: $746E0000. Process idhttp_proj.exe (5244)
Module Load: UnlockerHook.dll. No Debug Info. Base Address: $00E70000. Process idhttp_proj.exe (5244)
Module Load: lgscroll.dll. No Debug Info. Base Address: $10100000. Process idhttp_proj.exe (5244)
Module Load: MSVCR80.dll. No Debug Info. Base Address: $78130000. Process idhttp_proj.exe (5244)
Module Load: NTMARTA.dll. No Debug Info. Base Address: $77680000. Process idhttp_proj.exe (5244)
Module Load: WLDAP32.dll. No Debug Info. Base Address: $76F50000. Process idhttp_proj.exe (5244)
Module Load: SAMLIB.dll. No Debug Info. Base Address: $71BD0000. Process idhttp_proj.exe (5244)
Module Load: BtMmHook.dll. No Debug Info. Base Address: $00ED0000. Process idhttp_proj.exe (5244)
Module Load: widecapdrv.dll. No Debug Info. Base Address: $06000000. Process idhttp_proj.exe (5244)
Module Load: SETUPAPI.dll. No Debug Info. Base Address: $77910000. Process idhttp_proj.exe (5244)
Module Load: appHelp.dll. No Debug Info. Base Address: $77B30000. Process idhttp_proj.exe (5244)
Module Load: CLBCatQ.DLL. No Debug Info. Base Address: $76FC0000. Process idhttp_proj.exe (5244)
Module Load: COMRes.dll. No Debug Info. Base Address: $77040000. Process idhttp_proj.exe (5244)
Module Load: CSCUI.dll. No Debug Info. Base Address: $77A10000. Process idhttp_proj.exe (5244)
Module Load: CSCDLL.dll. No Debug Info. Base Address: $765D0000. Process idhttp_proj.exe (5244)
Thread Start: Thread ID: 684. Process idhttp_proj.exe (5244)
Module Load: MSWSOCK.dll. No Debug Info. Base Address: $71A30000. Process idhttp_proj.exe (5244)
Module Load: HNetCfg.dll. No Debug Info. Base Address: $698B0000. Process idhttp_proj.exe (5244)
Module Load: proxy32.dll. No Debug Info. Base Address: $01450000. Process idhttp_proj.exe (5244)
Module Load: WSHTCPIP.dll. No Debug Info. Base Address: $71A70000. Process idhttp_proj.exe (5244)
Thread Start: Thread ID: 5168. Process idhttp_proj.exe (5244)
Thread Start: Thread ID: 2984. Process idhttp_proj.exe (5244)
Thread Start: Thread ID: 5508. Process idhttp_proj.exe (5244)
Module Load: DNSAPI.dll. No Debug Info. Base Address: $76F10000. Process idhttp_proj.exe (5244)
Module Load: rasadhlp.dll. No Debug Info. Base Address: $76FB0000. Process idhttp_proj.exe (5244)
Thread Exit: Thread ID: 684. Process idhttp_proj.exe (5244)
Thread Exit: Thread ID: 5508. Process idhttp_proj.exe (5244)
Thread Exit: Thread ID: 5168. Process idhttp_proj.exe (5244)
Thread Exit: Thread ID: 2984. Process idhttp_proj.exe (5244)
многовато, но текстовый файл прикрепить не удалось...
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:7c90327a ntdll.RtlConvertUlongToLargeInteger + 0x3c
:7c90e48a ntdll.KiUserExceptionDispatcher + 0xe
:329a08b0 ; C:\WINDOWS\system32\CC3290MT.DLL
:329a08fb CC3290MT.__unsetuserhandler + 0x33
:329c44e9 ; C:\WINDOWS\system32\CC3290MT.DLL
:329012b3 ; C:\WINDOWS\system32\CC3290MT.DLL
:7c9235f7 ; ntdll.dll
:7c81cd86 ; C:\WINDOWS\system32\kernel32.dll
:7c81cdfe kernel32.ExitProcess + 0x14
:329c3ef8 ; C:\WINDOWS\system32\CC3290MT.DLL
:329c110b CC3290MT._execve + 0x7b
:329c1124 CC3290MT._exit + 0x10
:329c41d0 ; C:\WINDOWS\system32\CC3290MT.DLL
там много, поэтому привожу последние несколько строк
во вложении - всё полностью
(файл великоват, так что, пришлось пожать)
#include <vcl.h>
#pragma hdrstop
#include "idhttp_test.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TformIdhttp *formIdhttp;
TDateTime timeStartFile, timeFinishBlock;
__int64 bytesOfFile;
//---------------------------------------------------------------------------
__fastcall TformIdhttp::TformIdhttp(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TformIdhttp::btnGetClick(TObject *Sender)
{
String strUrl = lbedUrl->Text;
String strPath = lbedPath->Text;
String strSpeed;
__int64 timeForFile;
TFileStream *fs = new TFileStream(strPath, fmCreate, fmShareDenyNone);
idhttpTest->Get(strUrl, fs);
idhttpTest->Free();
fs->Free();//delete fs; //fs->Free();
timeForFile = MilliSecondsBetween(timeFinishBlock, timeStartFile);
if (timeForFile > 0) {
strSpeed = FormatFloat("'average speed is: '0.00' KB/s'", bytesOfFile*1000/timeForFile/1024);
statIndy->SimpleText = strSpeed;
}
}
//---------------------------------------------------------------------------
void __fastcall TformIdhttp::idhttpTestWorkBegin(TObject *ASender, TWorkMode AWorkMode,
__int64 AWorkCountMax)
{
if (AWorkMode == wmRead) {
timeStartFile = timeFinishBlock = Now();
bytesOfFile = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TformIdhttp::idhttpTestWork(TObject *ASender, TWorkMode AWorkMode,
__int64 AWorkCount)
{
if (AWorkMode == wmRead) {
__int64 timeForBlock = MilliSecondsBetween(Now(), timeFinishBlock);
if (timeForBlock > 0) {
double bytesInBlock = AWorkCount - bytesOfFile;
String s, strBytes;
if( bytesInBlock >= 1048576.0 )
s = FormatFloat("0.00' MB/s'", (bytesInBlock*1000/1048576.0)/timeForBlock);
else if( bytesInBlock >= 1024.0 )
s = FormatFloat("0.00' KB/s'", (bytesInBlock*1000/1024.0)/timeForBlock);
else
s = FormatFloat("0.00' B/s'", bytesInBlock*1000/timeForBlock);
strBytes = FormatFloat("0' bytes'", bytesInBlock);
statIndy->SimpleText = s;
lstReply->Items->Add(s);
lstBytes->Items->Add(strBytes);
Application->ProcessMessages();
}
bytesOfFile = AWorkCount;
timeFinishBlock = Now();
}
}
//---------------------------------------------------------------------------
void __fastcall TformIdhttp::btnCloseClick(TObject *Sender)
{
exit(0);
}
//---------------------------------------------------------------------------
собственно, вот весь код...
стоит закомментить строки:
idhttpTest->Get(strUrl, fs);
idhttpTest->Free();
- и всё работает нормально.
ещё одна интересная особенность -
вылетает прога только если запускать из борланда
с сообщением: "debugger fault notification"
если просто запускать exe-шник - всё норм
(madExcept поставил, спс)
->Free() никогда не надо, это для Delphi, надо delete.
И exit(0) меня смущает, но тут могу ошибаться. Лучше Application->Terminate().
->Free() никогда не надо, это для Delphi, надо delete.
И exit(0) меня смущает, но тут могу ошибаться. Лучше Application->Terminate().
поменял free на delete
и exit(0) на terminate (exit - это для консольных)
результат - отсутствует
//suicide is painless
//it brings on many changes
и exit(0) на terminate (exit - это для консольных)
результат - отсутствует
Все же повторюсь :) Попробуйте madExcept. Как минимум увидите последовательность вызовов каких функций приводит к краху программы.
говорюж madExcept поставил. спасибо
но он перехватывает ошибки только если запускать exe-шник
а там почему-то ошибок нет (видимо, винда их фиксит)
вылетает ТОЛЬКО при запуске из компиллятора по F9
после ряда шагов попадаю на windows.pas:
в частности, раз 20:
begin
FillChar(Destination^, Length, 0);
end;
затем:
begin
Result := _CreateMutexA(lpMutexAttributes, Integer(Boolean(bInitialOwner)), lpName);
end;
и затем:
HtmlHelpModule := 0;
finalization
if HtmlHelpModule <> 0 then FreeLibrary(HtmlHelpModule);
end.
а потом выкидывает в окно CPU:
7C90E483 51 push ecx
7C90E484 53 push ebx
7C90E485 E8F1C00100 call $7c92a57b
и, на последней строке вылетает то самое окно
"accsess violation..."
причём, опять же повторюсь, всё это происходит только если используется IdHTTP
(на форме ещё много всякого, но, если в инет не лазить, - прога закрывается ок)
В общем добрался я таки до bcb2k9. Этот проект у меня ни разу не вылетел. Досконально не разбирался что к чему - даже почему статус не обновляется.
вылетать начинает как только на чистую форму добавляешь доступ в инет
открыл новый проект, добавил кнопку, добавил OnClick
стоит вставить туда
или
кароче, что-нибудь, что ломится в инет - и при закрытии выдаёт ошибку
причем, в отличии от остальных ошибок, эту madExcept не ловит
стоит закомментить соединение с инетом - всё норм
и это - на совершенно пустой форме
В любом случае пробуйте на другой системе.
NMHTTP1->Get(" http://www.xxx.ru/pic.gif");
NMHTTP1->Body="pic.gif"; //на винт скинуть
NMHTTP1->Get(" http://www.xxx.ru/pic.gif");
NMHTTP1->Body="pic.gif"; //на винт скинуть
ок, ща попробую, а что это за компонент, где его найти,
и что надо подключить, чтоб он заработал?
В хелпе всё описано:
The TNMHTTP Component is used for conducting HTTP transfers across the World Wide Web. The TNMHTTP component is HTTP 1.1 compliant. и т.д.
хммм....
нет у меня вкладки fastnet
более того, хелпа говорит, что не знает ничего про TNMHTTP
это касается 2009? там чтото изменилось?
Во всех версиях билдера это были стандартные компонеты.
Во всех версиях билдера это были стандартные компонеты.
в 2009 только Indy
Во всех версиях билдера это были стандартные компонеты.
По-моему уже в Delphi 7 этих компонентов не было, так как они платные стали. Про 2006 точно не скажу.
решает проблему
пока не разобрался с URLDownloadToFile...
решу - отпишусь...
решает проблему
Боже! Вы хоть поняли что это?! Это то еще зачем?! Меня явно веселит сегодняшний форум..
кто что придумает - пишите
память освобождает
А вы ее выделяли? Прочитайте хоть в справке что делает TObject->FreeInstance(). Я даже помогу немного:
[QUOTE=Какая-то справка]
All destructors call FreeInstance automatically to deallocate memory that was allocated by overriding NewInstance.
Do not call FreeInstance directly. FreeInstance should be overridden if NewInstance was overridden to change the way the object’s instance data was allocated.
Like NewInstance, FreeInstance uses the value returned from InstanceSize to deallocate the object's memory.
[/QUOTE]
выкладываю проект
комментишь строку
разкомментишь - всё норм
дай мыло, куда скинуть проект, ато тут ограничение на zip 100кб
выкладываю проект
комментишь строку
разкомментишь - всё норм
дай мыло, куда скинуть проект, ато тут ограничение на zip 100кб
Не нужно просто засовывать в zip всякую ерунду. Я же как-то выложил проект? :) И всего 7 кб...
выкладываю проект
комментишь строку
разкомментишь - всё норм
project
на ссылку кликай
//собаку хоть бы заменил на чо...
я его через opera unite выкладываю,
так что он доступен только когда мой комп включён
попробуй щас
а если не успеешь - я сегодня после восьми буду дома
до поздней ночи включу - точно не промахнёшься
так что он доступен только когда мой комп включён
попробуй щас
а если не успеешь - я сегодня после восьми буду дома
до поздней ночи включу - точно не промахнёшься
Кинь на почту: nikitozz[собака]mail.ru