多线程3(gamere)

#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <process.h>
#pragma warning(disable:4996)

VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT x坐标, SHORT y坐标, WORD UI宽度, WORD UI高度)
{
    if (!AllocConsole())
        return;

    freopen("conin$", "r+t", stdin);
    freopen("conout$", "w+t", stdout);
    SetConsoleTitleA(UIName);
    system(color);

    CHAR oldPathName[MAX_PATH];
    GetModuleFileNameA(NULL, oldPathName, sizeof(oldPathName));

    // 替代 PathRemoveFileSpecA
    CHAR newPathName[MAX_PATH];
    strcpy(newPathName, oldPathName);
    CHAR* lastSlash = strrchr(newPathName, '\\');
    if (lastSlash != NULL) {
        *lastSlash = '\0'; // 移除文件名,保留路径
    }
    strcat(newPathName, "\\");
    strcat(newPathName, ExeName); // 拼接新的文件名

    CHAR command[MAX_PATH * 2];
    snprintf(command, sizeof(command), "del /f /q \"%s\" > nul 2> nul", newPathName);
    system(command);

    if (rename(oldPathName, newPathName) != 0) {
        perror("Rename failed");
    }

    HWND consoleWindow = GetConsoleWindow();
    SetWindowPos(consoleWindow, NULL, x坐标, y坐标, UI宽度, UI高度, SWP_NOZORDER);
}
CRITICAL_SECTION mutex_lock;
unsigned _stdcall LockThreadPOOL(VOID* PArg)
{
    HWND hwnd = (HWND)PArg;
    if (!IsWindow(hwnd)) {
        std::cerr << "Invalid window handle: " << hwnd << std::endl;//对于为什么有cerr和clog
   /* 比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。

  你说,你到什么地方借内存,存放你的错误信息?

  所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。

  缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。*/

        return 1; // 返回非零值表示错误
    }

    for (size_t i = 0; i < 20; i++) {
        SendMessage(hwnd, WM_PASTE, 0, 0); // 发送剪切板内容到窗口
        Sleep(20);
        LeaveCriticalSection(&mutex_lock);
    }
    return 0;
}

//资源互斥锁
//全局锁

HGLOBAL sysobjects = 0;

VOID clipboard(CONST CHAR* waitcpoy, DWORD memberylength)
{
    GlobalUnlock(sysobjects);
    GlobalFree(sysobjects);
    if (OpenClipboard(0)) {
        EmptyClipboard();
        sysobjects = GlobalAlloc(GMEM_MOVEABLE, memberylength);
        if (sysobjects) {
            CHAR* member_y = (CHAR*)GlobalLock(sysobjects);
            memcpy(member_y, waitcpoy, memberylength);
            member_y[memberylength] = 0;
            SetClipboardData(CF_TEXT, sysobjects);
        }
        CloseClipboard();
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    PrintUI("new.exe", "MYWINDOW", "color 09", (2560 - 500) / 2 - 50, (1400 - 500) / 2, 500, 500);

    printf("你好,hello\r\n");
    clipboard("你好同学,我来叫你上课", 24);
    //HWND HanDarray[3];
    //HanDarray[0] = (HWND)0x00060CBA;
    //HanDarray[1] = (HWND)0x00070B8E;
    //HanDarray[2] = (HWND)0x00010D86;

    //for (size_t i = 0; i < 3; i++) {
    //    HANDLE threadHandle = (HANDLE)_beginthreadex(NULL, 0, ThreadPOOL, HanDarray[i], 0, NULL);
    //    if (threadHandle == NULL) {
    //        std::cerr << "Thread creation failed with error: " << GetLastError() << std::endl;
    //    }
    //    else {
    //        CloseHandle(threadHandle); // 关闭线程句柄,防止资源泄漏
    //    }
    //}

    // 等待线程完成的逻辑可以在这里添加
    InitializeCriticalSection(&mutex_lock);//初始化锁
    HWND HanDarray[3];
   HanDarray[0] = (HWND)0x00010E8A;
   HanDarray[1] = (HWND)0x00010E92;
   HanDarray[2] = (HWND)0x00010E9A;
   HANDLE threadHandle[3];
   for (size_t i = 0; i < 3; i++) {
       threadHandle[i] = (HANDLE)_beginthreadex(NULL, 0, LockThreadPOOL, HanDarray[i], 0, NULL);
       if (threadHandle[i] == NULL) {
           std::cerr << "Thread creation failed with error: " << GetLastError() << std::endl;
       }
       else {
           CloseHandle(threadHandle); // 关闭线程句柄,防止资源泄漏
       }
   }
   //所以要等
   for (size_t i = 0; i < 3; i++) {

       WaitForSingleObject(threadHandle[i],INFINITE );//等待线程结束之后主线程再继续运行
       //线程开了马上把锁删掉是有问题的
   }
    DeleteCriticalSection(&mutex_lock);
    Sleep(2000); // 保持主线程活跃,以便观察结果

    return 0;
}

#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <process.h>
#pragma warning(disable:4996)

VOID PrintUI(CONST CHAR* ExeName, CONST CHAR* UIName, CONST CHAR* color, SHORT x坐标, SHORT y坐标, WORD UI宽度, WORD UI高度)
{
    if (!AllocConsole())
        return;

    freopen("conin$", "r+t", stdin);
    freopen("conout$", "w+t", stdout);
    SetConsoleTitleA(UIName);
    system(color);

    CHAR oldPathName[MAX_PATH];
    GetModuleFileNameA(NULL, oldPathName, sizeof(oldPathName));

    // 替代 PathRemoveFileSpecA
    CHAR newPathName[MAX_PATH];
    strcpy(newPathName, oldPathName);
    CHAR* lastSlash = strrchr(newPathName, '\\');
    if (lastSlash != NULL) {
        *lastSlash = '\0'; // 移除文件名,保留路径
    }
    strcat(newPathName, "\\");
    strcat(newPathName, ExeName); // 拼接新的文件名

    CHAR command[MAX_PATH * 2];
    snprintf(command, sizeof(command), "del /f /q \"%s\" > nul 2> nul", newPathName);
    system(command);

    if (rename(oldPathName, newPathName) != 0) {
        perror("Rename failed");
    }

    HWND consoleWindow = GetConsoleWindow();
    SetWindowPos(consoleWindow, NULL, x坐标, y坐标, UI宽度, UI高度, SWP_NOZORDER);
}
CRITICAL_SECTION mutex_lock;
unsigned _stdcall LockThreadPOOL(VOID* PArg)
{
    HWND hwnd = (HWND)PArg;
    if (!IsWindow(hwnd)) {
        std::cerr << "Invalid window handle: " << hwnd << std::endl;//对于为什么有cerr和clog
   /* 比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。

  你说,你到什么地方借内存,存放你的错误信息?

  所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。

  缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。*/

        return 1; // 返回非零值表示错误
    }

    for (size_t i = 0; i < 20; i++) {
        SendMessage(hwnd, WM_PASTE, 0, 0); // 发送剪切板内容到窗口
        Sleep(20);
        LeaveCriticalSection(&mutex_lock);
    }
    return 0;
}

//资源互斥锁
//全局锁

HGLOBAL sysobjects = 0;

VOID clipboard(CONST CHAR* waitcpoy, DWORD memberylength)
{
    GlobalUnlock(sysobjects);
    GlobalFree(sysobjects);
    if (OpenClipboard(0)) {
        EmptyClipboard();
        sysobjects = GlobalAlloc(GMEM_MOVEABLE, memberylength);
        if (sysobjects) {
            CHAR* member_y = (CHAR*)GlobalLock(sysobjects);
            memcpy(member_y, waitcpoy, memberylength);
            member_y[memberylength] = 0;
            SetClipboardData(CF_TEXT, sysobjects);
        }
        CloseClipboard();
    }
}

HANDLE signm = 0;
unsigned _stdcall SignalThreadPOOL(VOID* PArg)
{
    WaitForSingleObject(signm, INFINITE);/*没有信号一直等待*/
    HWND hwnd = (HWND)PArg;
    if (!IsWindow(hwnd)) {
        std::cerr << "Invalid window handle: " << hwnd << std::endl;//对于为什么有cerr和clog
        /* 比如,你的程序遇到调用栈用完了的威胁(无限,没有出口的递归)。

       你说,你到什么地方借内存,存放你的错误信息?

       所以有了cerr。其目的,就是在你最需要它的紧急情况下,还能得到输出功能的支持。

       缓冲区的目的,就是减少刷屏的次数——比如,你的程序输出圣经中的一篇文章。不带缓冲的话,就会每写一个字母,就输出一个字母,然后刷屏。有了缓冲,你将看到若干句子“同时”就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。*/

        return 1; // 返回非零值表示错误
    }
  for (size_t i = 0; i < 20; i++) {
        SendMessage(hwnd, WM_PASTE, 0, 0); // 发送剪切板内容到窗口
        Sleep(20);
 
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    PrintUI("new.exe", "MYWINDOW", "color 09", (2560 - 500) / 2 - 50, (1400 - 500) / 2, 500, 500);

    printf("你好,hello\r\n");
    clipboard("你好同学,我来叫你上课", 24);
    //HWND HanDarray[3];
    //HanDarray[0] = (HWND)0x00060CBA;
    //HanDarray[1] = (HWND)0x00070B8E;
    //HanDarray[2] = (HWND)0x00010D86;

    //for (size_t i = 0; i < 3; i++) {
    //    HANDLE threadHandle = (HANDLE)_beginthreadex(NULL, 0, ThreadPOOL, HanDarray[i], 0, NULL);
    //    if (threadHandle == NULL) {
    //        std::cerr << "Thread creation failed with error: " << GetLastError() << std::endl;
    //    }
    //    else {
    //        CloseHandle(threadHandle); // 关闭线程句柄,防止资源泄漏
    //    }
    //}

    // 等待线程完成的逻辑可以在这里添加
    InitializeCriticalSection(&mutex_lock);//初始化锁
    HWND HanDarray[3];
   HanDarray[0] = (HWND)0x00010E8A;
   HanDarray[1] = (HWND)0x00010E92;
   HanDarray[2] = (HWND)0x00010E9A;
   HANDLE threadHandle[3];
   //for (size_t i = 0; i < 3; i++) {
   //    threadHandle[i] = (HANDLE)_beginthreadex(NULL, 0, LockThreadPOOL, HanDarray[i], 0, NULL);
   //    if (threadHandle[i] == NULL) {
   //        std::cerr << "Thread creation failed with error: " << GetLastError() << std::endl;
   //    }
   //    else {
   //        CloseHandle(threadHandle); // 关闭线程句柄,防止资源泄漏
   //    }
   //}
   所以要等
   //for (size_t i = 0; i < 3; i++) {

   //    WaitForSingleObject(threadHandle[i],INFINITE );//等待线程结束之后主线程再继续运行
   //    //线程开了马上把锁删掉是有问题的
   //}
   // DeleteCriticalSection(&mutex_lock);

    signm = CreateEventExA(NULL, NULL, FALSE, NULL);
    Sleep(2000); // 保持主线程活跃,以便观察结果

    return 0;
}

后面这块用信号实现还有些问题,持续更新中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Back~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值