[问题] C++多执行绪执行问题

楼主: englishman (叶师父)   2018-09-13 10:38:19
开发平台(Platform): (Ex: Win10, Linux, ...)
Win10, i7 四核心处理器
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
VS2015
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
OpenCV
问题(Question):
各位先进大家好,我制作了一个透过WiFi传输读取外部device传来的影像然后即时显示到
PC UI的程式,程式分为UI层及kernel层,kernel层是一个包成DLL函式,里面有开执行绪
(可以设定开几个执行绪),不断地从kernel捞资料,然后透过callback方式传到UI层即时
显示。而为什么捞资料要用多执行绪,是因为捞完资料后需要进行后处理,所以希望用多执
行绪的方式进行影像后处理,以免仅使用单执行绪后处理花太多时间卡顿画面显示。
测试后,我遇到的问题是,当我使用超过一个执行绪去跑的时候,画面会有严重的卡顿,可是
当我在执行绪执行的loop里面加入"printf()"函式,画面就变得流畅多了??想请教先进有
什么多执行绪在设计的时候CPU资源方面我没注意到的吗?还是其他问题?? 十分感谢!!
喂入的资料(Input):
影像资料, 更新率大约8张/秒
预期的正确结果(Expected Output):
多执行绪抓取WiFi资料资料后能够流畅地即时显示在 UI
错误结果(Wrong Output):
没有加入printf(),画面卡顿,有加了printf(),画面变流畅
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
class ThreadFunc
{
public:
HANDLE hThread;
bool bExitThread;
DWORD dwThreadID;
unsigned char uchNo;
bool bIsRunning;
public:
ThreadFunc(HANDLE _hThread, bool _bExitThread, DWORD _dwThreadID,
unsigned char _uchNo, bool _bIsRunning) : hThread(_hThread),bExitThread
(_bExitThread), dwThreadID(_dwThreadID), uchNo(_uchNo), bIsRunning
(_bIsRunning) {}
ThreadFunc() { }
~ThreadFunc(){ }
void LoopCycle();
static DWORD WINAPI CoreThread(void* Param)
{
ThreadFunc* This = (ThreadFunc*)Param;
This->ThreadStart();
return NULL;
}
void Start()
{
hThread = CreateThread(NULL, 0, CoreThread, (void*) this, 0,
&dwThreadID);
}
void Exit()
{
if (hThread)
{
bExitThread = true;
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
hThread = NULL;
}
}
DWORD ThreadStart(void)
{
while (!bExitThread)
{
LoopCycle(); // 不断地去捞影像资料并做后处理
printf("Thread No. is %d\n\n", uchNo); // 有加这一行,
//程式会顺很多;没有这一
//行会卡顿
}
return 0;
}
};
ThreadFunc* g_pcThreadFunc = new ThreadFunc[4]; // 开 > 1 个执行绪, 假设
// 4 个
补充说明(Supplement):
作者: s4300026 (s4300026)   2018-09-13 14:34:00
sleep(0); ?
作者: VSei (Chaos)   2018-09-13 14:48:00
Polling太快造成卡顿? 经验是改成callback比较不会卡
作者: eye5002003 (下一夜)   2018-09-13 14:51:00
直觉就是sleep一点点就好,别让任何thread吸干资源
作者: dontfindme (Hsiu)   2018-09-13 14:59:00
直觉:给Thread一点休息时间,或是改成callback(比较好)
楼主: englishman (叶师父)   2018-09-17 14:23:00
感谢各位先进回答,加了Sleep()有效果,但需要加到Sleep(40)才会变得不会顿。另外,有试过从底层callback上去然后想让UI直接画图,但没有透过类似Android API 的RunOnUIThread()这种function似乎直接画是不可行的,请问在Windows下面有类似RunOnUIThread这种切到mainThread然后去画Form1的图的function或机制吗?感谢!
作者: easyman (oops)   2018-09-18 20:34:00
应该是wifi 有收到东西, 再判断是否完整thread 再用 WaitForSingleObject() 等待 完整data再开始处理, 处理完进 queue , main thread 来画

Links booklink

Contact Us: admin [ a t ] ucptt.com