2017-08-16 16 views
0

我正在使用IRC下载客户端,并且可以通过单击包含服务器地址,端口和下载文件所需的所有其他信息的链接来添加下载IRC。我将这些信息保存到文件中,以便在用户退出并重新启动下载客户端时重新下载下载列表。加载下载列表时,我为每次下载运行一个CWinThread函数。该函数创建所有服务器连接的列表(矢量)。如果到适当服务器的连接不存在,则相应地添加一个新连接。一切都按预期工作,但如果我将项目添加到CTreeCtrl,程序周期似乎有所不同。向CTreeCtrl插入项目时线程函数的奇怪行为

//For each download I'm calling this in a loop 
AfxBeginThread(RequestDownload, (LPVOID)&m_RequestStruct); 

//In this function I'm comparing the available server 
//connections with the required server connection 
//for the download and set a BOOL if it exists 

UINT MyProgramDlg::RequestDownload(LPVOID pParam) 
{ 
    //... 
    if (ConnectionExists) 
    { 
     //Use the connection and 
     //don't add a new one to the list 
    } 

    if (!ConnectionExists) 
    { 
     //Add a new connection 
     ConnectionStruct Connection; 
     Connection.Status = STAT_DISCONNECTED; 
     Connection.Connecting = FALSE; 
     Connection.Connected = FALSE; 
     Connection.LoggingOn = FALSE; 
     Connection.LoggedOn = FALSE; 
     Connection.Listening = FALSE; 
     Connection.NetworkName = pRS->pm_Downloads->at(DownloadIndex).NetworkName; 
     Connection.NetworkAddress = pRS->pm_Downloads->at(DownloadIndex).NetworkAddress; 

     // Insert the tree item and save its handle 
     // The following line is the EVIL LINE that makes my program misbehave 
     Connection.hTreeItem = pRS->pm_TreeCtrl->InsertItem(_T("Test"), 0, 0, NULL, NULL); 

     // Add the new connection 
     pRS->pm_Connections->push_back(Connection); 
     // (BREAK POINT 1) 

     // Get the index of the added connection 
     ConnectionIndex = (int) pRS->pm_Connections->size() - 1; 
     // (BREAK POINT 2) 
     //... 
    } 
    //... 
} 

如果我加载来自同一服务器地址的两个下载没有(!),“邪恶线”,调试器从断点1跳到从断点1再次突破点2,然后突破点2。但随着邪恶线被启用它从跳转点1跳到断点1,然后从断点2跳到断点2.

我非常需要解决这个问题。 任何帮助表示赞赏!

+0

MyProgramDlg :: RequestDownload函数是一个静态成员函数吗?因为它需要。一个非静态成员函数有一个隐藏的参数变成'this'变量。这样的问题通常通过使用静态封装函数来解决,这些函数作为参数采用一个包含(指向)对象的结构,然后使用该对象调用实函数。 –

+0

是的,它是一个静态成员函数 –

+0

那么这个函数是由多个线程运行吗?如果是这样的话,听起来好像你是调试器中的线程之间的上下文切换与每个步骤指令。如果你在这样一个函数中有一个断点,Visual Studio会这样做。调出线程窗口。开始调试。检查跳转时是否处于不同的线程中。 这种情况下的解决方法是右键单击不想调试的线程,然后选择“暂停”(可能是“冻结”,我忘记了),然后恢复调试。确保在完成后解冻它 – Joe

回答

0

仅添加睡眠可能无效!尝试添加一个线程同步方法,如临界区或Mutex。

+0

我真的不知道什么是关键部分或互斥体。你能否给我进一步的信息。甚至可能是代码示例? –

+0

查看此链接以获取简单的关键部分实现:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686908(v=vs.85).aspx – Srivatsa

0

工作线程对直接调用调用UI是非法的,这解释了奇怪的行为。将句柄传递给线程,然后使用sendMessage/postMessage。

+0

感谢您的帮助!你能给我一个如何做到这一点的代码示例? –