a949422086 发表于 2025-6-25 07:06:28

求助!!!"启动有状态线程"崩溃

<火山程序 类型 = "通常" 版本 = 1 />

包 火山.程序

类 启动类 <公开 基础类 = 动态库程序类>
{
    变量 线程状态 <类型 = 线程状态类>

    方法 启动方法 <公开 类型 = 整数>
    {
      启动有状态线程 (线程状态, 线程测试函数, 262144, )
      返回 (1)
    }

    方法 线程测试函数 <静态>
    参数 线程状态对象 <类型 = 线程状态类>
    {
      全局信息框 ("我是线程测试函数", , , )
    }
}



在火山视窗DLL的启动方法里执行 "启动有状态线程" 直接崩溃,改用启动线程就没事。有没有大佬告知下原因

创世魂 发表于 2025-6-25 07:55:38

线程里面不要弹出信息框。也不要操作任何组件。

a949422086 发表于 2025-6-25 08:09:48

创世魂 发表于 2025-6-25 07:55
线程里面不要弹出信息框。也不要操作任何组件。

<火山程序 类型 = "通常" 版本 = 1 />

包 火山.程序

类 启动类 <公开 基础类 = 动态库程序类>
{
    变量 线程状态 <类型 = 线程状态类>

    方法 启动方法 <公开 类型 = 整数>
    {
      启动有状态线程 (线程状态, 线程测试函数, , )
      返回 (1)
    }

    方法 线程测试函数 <静态>
    参数 线程状态对象 <类型 = 线程状态类>
    {
      // 全局信息框 ("我是线程测试函数", , , )
    }
}

线程函数里不写任何代码也会崩溃。
只有在DLL的启动方法里调用"启动有状态线程"才会这样。
如果是EXE就不会,但是DLL启动方法里改成使用"启动线程"又正常了

Xelloss0618 发表于 2025-6-25 09:24:23

测试了一下,并非不能在DLL里使用,而是不能在DLL的启动方法里使用。
可能是启动有状态线程用了些不能在dll入口函数里使用的API吧。
换其他方法吧,这个有状态线程也不好用。建议PIV或仰望模块的“启动静态线程”,传参也更简单。

793359277 发表于 2025-6-25 22:04:21

DllMain中有诸多限制, "启动有状态线程"创建线程之后,内部调用了WaitForSingleObject, 导致死锁.

a949422086 发表于 2025-6-26 23:43:29

793359277 发表于 2025-6-25 22:04
DllMain中有诸多限制, "启动有状态线程"创建线程之后,内部调用了WaitForSingleObject, 导致死锁.

...

原来如此,谢谢
页: [1]
查看完整版本: 求助!!!"启动有状态线程"崩溃