在并行线程中正确使用WinInet

问题描述

我正在编写一个用户界面程序,该程序解析Google结果页以从购物网站(尤其是从亚马逊)中查找商品。

因为它具有用户界面,所以它显然应该在并行线程中执行所有Internet操作,否则程序将被挂起。

我在多线程方面实际上并不擅长,并且显然做得不好,例如:

HINTERNET internet;
int GetRequest(wchar_t* url,char *buffer,int bufersize)
{
int read = 0;

if (internet)
{
DWORD dwBytesRead;

HINTERNET hu = InternetopenUrl(internet,url,L"Content-Type: application/x-www-form-urlencoded\r\n",wcslen(L"Content-Type: application/x-www-form-urlencoded\r\n"),INTERNET_FLAG_KEEP_CONNECTION,0);

if (hu)
{
  int err = GetLastError();

  for (;;)
  {
    char b[1024] = {};
    BOOL bRead = InternetReadFile(hu,buffer + read,sizeof(b),&dwBytesRead);

    read += dwBytesRead;
    if (dwBytesRead == 0)
      break;
  }
}
else
  read = -1;

InternetCloseHandle(hu);

}
else
 read = -2;

return read;
}

用法

int status;
void run();

int main()
{
internet = Internetopen(L"My user agent",INTERNET_OPEN_TYPE_PRECONfig,0); 
std::thread t(run);
t.detach();

while(status==0){}

if(status==1)
{
char *response = new char[1024*1024*2];
MessageBoxA(NULL,response,"Aga",MB_OK);
}
else
 MessageBoxA(NULL,"Error",MB_OK);

delete[] response;
status = 0;
return 0;
}

void run()
{
char *buffer = new char[1024*1024*2]; // 2mb buffer
int read = GetRequest(L"https://www.google.com/search?q=lolkek",buffer,1024*1024*2); // or www.search.yahoo.com
strcat_s(response,1024*1024*2,buffer);
delete[] buffer;
if(read>=0)
status = 1;
else
status = -1;
}

实际上,它运行完美。该程序可以满足我的要求。

但是,我遇到了一个问题:程序运行时,我打开了Chrome,亚马逊网站上的某些按钮不起作用。特别是产品页面中的“卖出”按钮-单击该按钮,没有任何反应,关闭我的程序,现在该按钮打开登录页面。而且,即使程序仅与Yahoo一起使用,它似乎也会破坏某些Google表格中的数据。

程序不能直接访问amazon.com或任何购物网站。它一直在连接google.com,但现在甚至只连接到search.yahoo.com。

有人遇到过类似的事情吗?问题是不正确的多线程吗?也许我应该更改Internet标志(不完全更改为异步标志,但可以添加INTERNET_FLAG_NO_CACHE_WRITE或类似的东西吗?


我有一个假设:之所以会发生是因为一次运行了三个程序实例。当程序运行时,还会在Chrome中打开带有损坏的Google表格的标签

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)