-
Notifications
You must be signed in to change notification settings - Fork 316
Description
Prerequisites
- Write a descriptive title.
- Make sure you are able to repro it on the latest released version
- Search the existing issues, especially the pinned issues.
Exception report
gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_ins
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_inst
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_insta
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_instan
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_instanc
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_instance
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_instance.
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_instance.e
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_instance.ex
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.Insert(Char c)
在 Microsoft.PowerShell.PSConsoleReadLine.SelfInsert(Nullable`1
key, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws2_32 && & .\ping_single_instance.exe
哎呀,出现问题。请在报告此 Bug 时添加以下详细信息。
在 GitHub 上报告: https://github.com/lzybkr/PSReadLine/issues/new
-----------------------------------------------------------------------
上 200 个密钥:
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Enter
Enter
& Space . \ p i n g _ s i n g l e _ i n s t a n c e . e x e Enter
Enter
g c c Space - o Space p i n g _ s i n g l e _ i n s t a n c e . e
x e Space s r c / s i n g l e _ i n s t a n c e _ p i n g . c Space - l w s 2 _ 3 2 Space & & Space & Space . \ p i n g _ s i n g l e
_ i n s t a n c e . e x e Enter
Enter
异常:
System.ArgumentOutOfRangeException: 该值必须大于或等于零,且必须小于控制台缓冲区在该维度的大小。
参数名: top
实际值是 -1。
在 System.Console.SetCursorPosition(Int32 left, Int32 top)
在 Microsoft.PowerShell.PSConsoleReadLine.ReallyRender(RenderData renderData, String defaultColor)
在 Microsoft.PowerShell.PSConsoleReadLine.ForceRender()
在 Microsoft.PowerShell.PSConsoleReadLine.AcceptLineImpl(Boolean validate)
在 Microsoft.PowerShell.PSConsoleReadLine.ProcessOneKey(ConsoleKeyInfo key, Dictionary`2 dispatchTable, Boolean ignoreIfNoAction, Object arg)
在 Microsoft.PowerShell.PSConsoleReadLine.InputLoop()
在 Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------
(TraeAI-3) D:\ping_project [0:0] $ gcc -o ping_single_instance.exe src/single_instance_ping.c -lws所在位置 行:1 字符: 69
+ ... ng_single_instance.exe src/single_instance_ping.c -lws2_32 &
& & .\pin ...
+ ~
~
标记“&&”不是此版本中的有效语句分隔符。
+ CategoryInfo : ParserError: (:) [], ParentContains
ErrorRecordException
+ FullyQualifiedErrorId : InvalidEndOfLineScreenshot
N/A
Environment data
PS Version: 5.1.19041.6691
PS HostName: ConsoleHost
PSReadLine Version: 2.0.0-beta2
PSReadLine EditMode: Windows
OS: 10.0.19041.4522 (WinBuild.160101.0800)
BufferWidth: 120
BufferHeight: 3000Steps to reproduce
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
static HANDLE g_mutex = NULL;
static FILE* g_log = NULL;
static CRITICAL_SECTION g_cs;
// 函数声明
static void format_timestamp(char* buf, size_t sz);
static void log_line(const char* tag, const char* msg);
static int utf8_to_acp(const char* utf8_str, char* acp_str, int acp_size);
static int acp_to_utf8(const char* acp_str, char* utf8_str, int utf8_size);
// 线程池相关定义
#define MAX_THREADS 4
// 任务结构体
typedef struct {
int task_id;
char target[64]; // ping的目标地址
int count; // ping的次数
} Task;
// 线程池结构体
typedef struct {
HANDLE threads[MAX_THREADS];
HANDLE task_queue_sem;
HANDLE task_queue_mutex;
HANDLE stop_event;
Task* task_queue;
int queue_size;
int queue_front;
int queue_rear;
int task_count;
int total_tasks; // 总任务数
int completed_tasks; // 已完成任务数
HANDLE completed_tasks_mutex;
} ThreadPool;
static ThreadPool g_thread_pool;
// 初始化线程池
static BOOL init_thread_pool(int queue_size) {
memset(&g_thread_pool, 0, sizeof(g_thread_pool));
g_thread_pool.queue_size = queue_size;
g_thread_pool.task_queue = (Task*)malloc(queue_size * sizeof(Task));
if (!g_thread_pool.task_queue) {
log_line("main", "failed to allocate task queue");
return FALSE;
}
// 创建信号量和互斥量
g_thread_pool.task_queue_sem = CreateSemaphoreA(NULL, 0, queue_size, NULL);
g_thread_pool.task_queue_mutex = CreateMutexA(NULL, FALSE, NULL);
g_thread_pool.stop_event = CreateEventA(NULL, TRUE, FALSE, NULL);
g_thread_pool.completed_tasks_mutex = CreateMutexA(NULL, FALSE, NULL);
if (!g_thread_pool.task_queue_sem || !g_thread_pool.task_queue_mutex ||
!g_thread_pool.stop_event || !g_thread_pool.completed_tasks_mutex) {
log_line("main", "failed to create thread pool synchronization objects");
free(g_thread_pool.task_queue);
return FALSE;
}
g_thread_pool.total_tasks = 0;
g_thread_pool.completed_tasks = 0;
return TRUE;
}
// 销毁线程池
static void destroy_thread_pool() {
SetEvent(g_thread_pool.stop_event);
// 等待所有线程结束
WaitForMultipleObjects(MAX_THREADS, g_thread_pool.threads, TRUE, INFINITE);
// 关闭句柄
for (int i = 0; i < MAX_THREADS; i++) {
if (g_thread_pool.threads[i]) {
CloseHandle(g_thread_pool.threads[i]);
}
}
CloseHandle(g_thread_pool.task_queue_sem);
CloseHandle(g_thread_pool.task_queue_mutex);
CloseHandle(g_thread_pool.stop_event);
CloseHandle(g_thread_pool.completed_tasks_mutex);
// 释放任务队列
free(g_thread_pool.task_queue);
}
// 添加任务到线程池
static BOOL add_task_to_pool(int task_id, const char* target, int count) {
WaitForSingleObject(g_thread_pool.task_queue_mutex, INFINITE);
// 检查队列是否已满
if (g_thread_pool.task_count >= g_thread_pool.queue_size) {
ReleaseMutex(g_thread_pool.task_queue_mutex);
return FALSE;
}
// 添加任务到队列
Task* task = &g_thread_pool.task_queue[g_thread_pool.queue_rear];
task->task_id = task_id;
strncpy(task->target, target, sizeof(task->target) - 1);
task->count = count;
g_thread_pool.queue_rear = (g_thread_pool.queue_rear + 1) % g_thread_pool.queue_size;
g_thread_pool.task_count++;
ReleaseMutex(g_thread_pool.task_queue_mutex);
// 增加总任务数计数
WaitForSingleObject(g_thread_pool.completed_tasks_mutex, INFINITE);
g_thread_pool.total_tasks++;
ReleaseMutex(g_thread_pool.completed_tasks_mutex);
// 通知工作线程有新任务
ReleaseSemaphore(g_thread_pool.task_queue_sem, 1, NULL);
return TRUE;
}
// 从任务队列中取出任务
static BOOL get_task_from_pool(Task* task) {
DWORD dwResult = WaitForMultipleObjects(2,
(const HANDLE[]){g_thread_pool.stop_event, g_thread_pool.task_queue_sem},
FALSE, INFINITE);
// 检查是否收到停止信号
if (dwResult == WAIT_OBJECT_0) {
return FALSE;
}
// 检查是否有任务
if (dwResult == WAIT_OBJECT_0 + 1) {
WaitForSingleObject(g_thread_pool.task_queue_mutex, INFINITE);
// 取出任务
*task = g_thread_pool.task_queue[g_thread_pool.queue_front];
g_thread_pool.queue_front = (g_thread_pool.queue_front + 1) % g_thread_pool.queue_size;
g_thread_pool.task_count--;
ReleaseMutex(g_thread_pool.task_queue_mutex);
return TRUE;
}
return FALSE;
}
// 工作线程函数
static DWORD WINAPI thread_pool_worker(LPVOID param) {
int thread_idx = (int)(intptr_t)param;
char tag[16];
_snprintf(tag, sizeof(tag), "thread%d", thread_idx);
log_line(tag, "start");
Task task;
while (get_task_from_pool(&task)) {
// 执行ping任务
char task_info[128];
_snprintf(task_info, sizeof(task_info), "task%d: ping %s -n %d", task.task_id, task.target, task.count);
log_line(tag, task_info);
// 构建ping命令
char ping_cmd[128];
_snprintf(ping_cmd, sizeof(ping_cmd), "ping %s -n %d", task.target, task.count);
// 执行ping命令
FILE* fp = _popen(ping_cmd, "r");
if (!fp) {
log_line(tag, "failed to start ping");
continue;
}
char acp_buf[512];
char utf8_buf[1024];
while (fgets(acp_buf, sizeof(acp_buf), fp)) {
size_t len = strlen(acp_buf);
while (len && (acp_buf[len - 1] == '\n' || acp_buf[len - 1] == '\r')) {
acp_buf[--len] = '\0';
}
// 将系统默认编码转换为UTF-8
if (acp_to_utf8(acp_buf, utf8_buf, sizeof(utf8_buf)) > 0) {
log_line(tag, utf8_buf);
} else {
log_line(tag, acp_buf);
}
}
_pclose(fp);
log_line(tag, "done");
// 增加已完成任务计数
WaitForSingleObject(g_thread_pool.completed_tasks_mutex, INFINITE);
g_thread_pool.completed_tasks++;
ReleaseMutex(g_thread_pool.completed_tasks_mutex);
}
log_line(tag, "exit");
return 0;
}
static void format_timestamp(char* buf, size_t sz) {
SYSTEMTIME st;
GetLocalTime(&st);
_snprintf(buf, sz, "%04d-%02d-%02d %02d:%02d:%02d.%03d",
st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
}
// 编码转换函数:UTF-8转系统默认编码(用于终端输出)
static int utf8_to_acp(const char* utf8_str, char* acp_str, int acp_size) {
// 获取系统默认代码页
UINT acp_code = GetACP();
// 转换为宽字符
int len = MultiByteToWideChar(CP_UTF8, 0, utf8_str, -1, NULL, 0);
if (len <= 0) return -1;
wchar_t* wbuf = (wchar_t*)malloc(len * sizeof(wchar_t));
if (!wbuf) return -1;
MultiByteToWideChar(CP_UTF8, 0, utf8_str, -1, wbuf, len);
// 转换为系统默认编码
len = WideCharToMultiByte(acp_code, 0, wbuf, -1, acp_str, acp_size, NULL, NULL);
free(wbuf);
return len;
}
static void log_line(const char* tag, const char* msg) {
EnterCriticalSection(&g_cs);
char ts[64];
format_timestamp(ts, sizeof(ts));
// 构建完整的日志行
char full_msg[2048];
_snprintf(full_msg, sizeof(full_msg), "%s [%s] %s\n", ts, tag, msg);
// 输出到控制台:将UTF-8转换为系统默认编码
char console_msg[2048];
if (utf8_to_acp(full_msg, console_msg, sizeof(console_msg)) > 0) {
fprintf(stdout, "%s", console_msg);
} else {
// 转换失败时直接输出,可能会有乱码但至少能看到内容
fprintf(stdout, "%s", full_msg);
}
fflush(stdout);
// 输出到文件:直接使用UTF-8编码
if (g_log) {
fprintf(g_log, "%s", full_msg);
fflush(g_log);
}
LeaveCriticalSection(&g_cs);
}
// 通用编码转换函数:将系统默认编码转换为UTF-8
static int acp_to_utf8(const char* acp_str, char* utf8_str, int utf8_size) {
// 获取系统默认代码页
UINT acp_code = GetACP();
// 转换为宽字符
int len = MultiByteToWideChar(acp_code, 0, acp_str, -1, NULL, 0);
if (len <= 0) return -1;
wchar_t* wbuf = (wchar_t*)malloc(len * sizeof(wchar_t));
if (!wbuf) return -1;
MultiByteToWideChar(acp_code, 0, acp_str, -1, wbuf, len);
// 转换为UTF-8
len = WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, utf8_str, utf8_size, NULL, NULL);
free(wbuf);
return len;
}
// 原来的ping_worker函数已被线程池的thread_pool_worker替代
int main(void) {
g_mutex = CreateMutexA(NULL, TRUE, "PingLoopbackSingleInstance_Mutex");
if (!g_mutex) {
printf("Failed to create mutex\n");
return 1;
}
if (GetLastError() == ERROR_ALREADY_EXISTS) {
printf("Another instance is already running\n");
CloseHandle(g_mutex);
return 1;
}
InitializeCriticalSection(&g_cs);
// Get current exe file path
char exe_path[MAX_PATH] = {0};
GetModuleFileNameA(NULL, exe_path, MAX_PATH);
// Extract file name (without path)
char* exe_name = strrchr(exe_path, '\\');
if (!exe_name) {
exe_name = exe_path;
} else {
exe_name++;
}
// Create log file name with same name as exe, with .log extension
char log_path[MAX_PATH] = {0};
char* dot = strrchr(exe_name, '.');
if (dot) {
// Copy file name up to dot
size_t len = dot - exe_name;
strncpy(log_path, exe_name, len);
// Add .log extension
strcat(log_path, ".log");
} else {
// No extension case
strcpy(log_path, exe_name);
strcat(log_path, ".log");
}
// Open log file for writing in UTF-8
g_log = fopen(log_path, "a");
if (!g_log) {
printf("Failed to open log file\n");
DeleteCriticalSection(&g_cs);
ReleaseMutex(g_mutex);
CloseHandle(g_mutex);
return 1;
}
// Check if file is empty, write UTF-8 BOM if needed
fseek(g_log, 0, SEEK_END);
if (ftell(g_log) == 0) {
const char bom[3] = {0xEF, 0xBB, 0xBF};
fwrite(bom, 1, sizeof(bom), g_log);
}
fseek(g_log, 0, SEEK_END);
{
char startbuf[128];
_snprintf(startbuf, sizeof(startbuf), "start pid=%lu", (unsigned long)GetCurrentProcessId());
log_line("main", startbuf);
}
// 初始化线程池,队列大小为8
if (!init_thread_pool(8)) {
log_line("main", "failed to initialize thread pool");
DeleteCriticalSection(&g_cs);
ReleaseMutex(g_mutex);
CloseHandle(g_mutex);
return 1;
}
// 创建工作线程
for (int i = 0; i < MAX_THREADS; i++) {
g_thread_pool.threads[i] = CreateThread(NULL, 0, thread_pool_worker, (LPVOID)(intptr_t)(i + 1), 0, NULL);
if (!g_thread_pool.threads[i]) {
log_line("main", "failed to create thread");
}
}
// 添加4个ping任务到线程池,使用不同的目标地址和ping次数
add_task_to_pool(1, "127.0.0.1", 2); // ping本地回环地址2次
add_task_to_pool(2, "127.0.0.1", 2); // ping本地回环地址2次
add_task_to_pool(3, "127.0.0.1", 2); // ping本地回环地址2次
add_task_to_pool(4, "127.0.0.1", 2); // ping本地回环地址2次
// 主线程保持运行,允许用户拖动控制台窗口
// 等待所有任务完成
BOOL all_tasks_done = FALSE;
while (!all_tasks_done) {
// 检查已完成任务数是否等于总任务数
WaitForSingleObject(g_thread_pool.completed_tasks_mutex, INFINITE);
all_tasks_done = (g_thread_pool.completed_tasks >= g_thread_pool.total_tasks);
ReleaseMutex(g_thread_pool.completed_tasks_mutex);
if (!all_tasks_done) {
Sleep(100);
}
}
// 销毁线程池
destroy_thread_pool();
log_line("main", "all done");
fclose(g_log);
g_log = NULL;
DeleteCriticalSection(&g_cs);
ReleaseMutex(g_mutex);
CloseHandle(g_mutex);
return 0;
}
Expected behavior
N/A
Actual behavior
N/A