Winapi Win32 C++;在单独的文件/线程中使用HWND启动计时器

Winapi Win32 C++;在单独的文件/线程中使用HWND启动计时器,winapi,visual-c++,c++98,Winapi,Visual C++,C++98,背景: 应用程序类型:Win32应用程序 语言:C++(C语言也有) 问题:要在另一个文件中使用主窗口句柄 更新1:在另一个线程中使用TCP服务器。此服务器从客户端接收信息,然后需要启动程序中的计时器。 项目布局: 主文件:Main.cpp/Main.h,其中包含WinMain、WndProc等 其他生成的文件:Resource.h、main.rc、stdafx.h等由Visual Studio生成 自制文件:functions.cpp/functions.h&calculation.cpp/c

背景:

应用程序类型:Win32应用程序

语言:C++(C语言也有)

问题:要在另一个文件中使用主窗口句柄

更新1:在另一个线程中使用TCP服务器。此服务器从客户端接收信息,然后需要启动程序中的计时器。

项目布局:

主文件:Main.cpp/Main.h,其中包含WinMain、WndProc等

其他生成的文件:Resource.h、main.rc、stdafx.h等由Visual Studio生成

自制文件:functions.cpp/functions.h&calculation.cpp/calculation.h

更新1:服务器线程位于main.cpp文件中,并在服务器线程上调用启动计时器。我还更新了一些代码,以更准确地反映我的情况。

信息:

我能否以某种方式调用calculation.cpp文件中的SetTimer(hwnd、TIMER\u INT、TIMER\u INTERVAL、NULL),并在WndProc中为WM\u TIMER设置TIMER\u INT TIMER触发器

例如(当然,foo是在calculation.h中为其他函数定义的)

问题是试图将对hwnd的引用从服务器线程传递到calculation.cpp。我可以将hwnd传递给函数foo(hwnd),但计时器没有设置。有没有办法在一个单独的线程中设置计时器,或者这是不可能的?使用winsock和服务器是否还有其他解决方法?

表示无法从其他线程为窗口创建计时器。对于您来说,不同的线程是服务器线程

当计时器超时时,您可以将消息()从服务器线程发送到主线程


或者您需要线程同步。

您的代码应该按原样工作,而且是安全的。有什么问题吗?代码中没有指针。为了改进,您可以将其更改为case
WM\u TIMER:if(wParam==TIMER\u INT){…}
,以确保它是正确的计时器id。
MessageBox
通常使用所有者窗口的
hWnd
<对于默认情况,code>WndProc应返回
DefWindowProc
。对不起,我之前的问题可能没有足够的详细信息。我更新了原始版本中更详细的部分。我验证了它可以与单线程应用程序一起工作,但我无法让它与服务器线程一起工作。目前还不清楚。您正在创建与GUI线程分离的第二个线程
foo
是从GUI线程调用的,与第二个线程无关。您应该解释您的程序试图做什么,以及遇到什么问题。提供有关VB6代码的详细信息似乎无关紧要。我知道我一定是忘记了将foo移动到线程。我已经在线程中更新了foo函数。基本上,当retString具有特定条件时,它将调用fooDocumentation for
SetTimer
说明“此窗口必须由调用线程拥有”(我不确定为什么会这样),因此您应该在GUI线程
WM_CREATE
中调用
SetTimer
。对于工作线程,您可以设置一个全局变量,例如
g_start=TRUE
,然后基于该变量继续。
//calculation.cpp
void foo(HWND hwnd)
{
    SetTimer(hwnd, TIMER_INT, TIMER_INTERVAL, NULL);
}

//functions.cpp

void ThreadStart()
{
    /* This code initializes a working server that is visible to main.cpp */
    /* The Server socket and Accept socket are extern for main.cpp */
}

//main.cpp
HWND hwnd;
int WinMain(...)
{
    //... Set hwnd here
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, ...)
{
    static PARAMS params; //Thread params
    switch(message)
    {

    case WM_CREATE:
        //This initializes a blocking Server (which works)
        params.hwnd = hWnd;
        params.bContinue = TRUE;
        _beginthread(ThreadServer, 0, &params);
        break;

    case WM_TIMER:
        case TIMER_INT:
            MessageBox(NULL, L"Timer was triggered from foo", L"FOO", NULL);
            //continuous messageboxes will appear based on TIMER_INTERVAL if it works...
            break;
        break;

     }
}

void ThreadServer(PVOID pvoid)
{
    ThreadStart(); //calls accept() until client connects
    while(1)
    {
        memset(&RecvBuffer[0], 0, 512 * sizeof(RecvBuffer[0])); //Clear recv
        TCPServer.iRecv = recv(AcceptSocket, RecvBuffer, iRecvBuffer, 0);

        if(strlen(RecvBuffer) > 1){
            memset(&SendBuffer[0], 0, 512 * sizeof(SendBuffer[0]));
                //Clears SendBuffer
            std::string retString = "";
            retString = process(RecvBuffer); //processes RecvBuffer

                if(condition == true){
                    foo(hwnd);
                }

            if(strlen(retString.c_str()) > 0){
                TCPServer.iSend = send(AcceptSocket, retString.c_str(), strlen(retString.c_str()), 0);
            }else{
                retString = "";
                TCPServer.iSend = send(AcceptSocket, retString.c_str(), strlen(retString.c_str()), 0);
            }

            if(TCPServer.iSend == SOCKET_ERROR){
                break;
            }
        }
        //Determine if socket fails and breaks if failure occurs
        //*
        memset(&SendBuffer[0], 0, 512 * sizeof(SendBuffer[0]));
        TCPServer.iSend = send(AcceptSocket, SendBuffer, iSendBuffer, 0);
            if(TCPServer.iSend == SOCKET_ERROR){
             break;
        }//*/

        Sleep(1);

    }
}