【问题标题】:Threading in C with CreateThread()使用 CreateThread() 在 C 中进行线程化
【发布时间】:2013-05-09 13:06:47
【问题描述】:

我是 C 的新手,我正在尝试编写一个程序来运行 MIDI 序列,基本上,我有两个函数,都运行不同的 MIDI 模式,我需要它们并行运行。由于函数的性质(一个运行序列,另一个播放随机音符),我几乎 100% 确定我不能再运行相同的函数。

我一直在互联网上搜索有关如何使用 pthreads(显然不适用于 Windows?)和 CreateThread() 的一些线索,但我似乎无法让它工作。我目前正在尝试使用 CreateThread() 并尝试引入随机 midi 序列所需的整数,我收到有关“LPTHREAD_START_ROUTINE”的错误,内容为:“预期为“LPTHREAD_START_ROUTINE”,但参数类型为“DWORD (*) (int, int, int)'。

我正在处理的一种伪代码在这里:

DWORD WINAPI solo_thread(int key, int tempo, int scale)
{
                  ///// this contains the random midi notes
}
int backing(int key, int tempo, int backing)
{
    HANDLE thread = CreateThread(NULL, 0, solo_thread, NULL, 0, NULL);
    if (thread) {
                 ////// this contains the midi sequence

}

希望我已经很好地解释了我的问题......但我很清楚最有可能的情况是我正在以所有错误的方式处理这个 CreateThread() 事情。

谢谢!

【问题讨论】:

  • 我不认为多线程会解决你的问题,因为我担心你会陷入如何同步线程的问题。想象一下,如果两个线程中的一个线程比另一个线程获得更多的 CPU 时间并且运行得更快会发生什么......

标签: c windows multithreading winapi createthread


【解决方案1】:

线程入口函数的签名,来自ThreadProc()参考页:

DWORD WINAPI ThreadProc(
  _In_  LPVOID lpParameter
);

solo_thread() 没有那个签名。

如果需要为函数提供多个参数,请创建一个struct,其中包含表示所需参数的多个成员。线程的参数必须超过线程,否则线程将访问一个悬空指针。常见的解决方案是动态分配参数,并在不再需要时让线程free() 它。

例子:

struct Thread_data
{
    int key;
    int tempo;
    int scale;
};

DWORD WINAPI solo_thread(void* arg)
{
    struct Thread_data* data = arg;

    /* Use 'data'. */

    free(data);
    return 0;
}

int backing(int key, int tempo, int backing)
{
    struct Thread_data* data = malloc(*data);
    if (data)
    {
        data->key   = key;
        data->tempo = tempo;
        data->scale = backing;
        HANDLE thread = CreateThread(NULL, 0, solo_thread, &data, 0, NULL);
    }

【讨论】:

  • 您好,感谢您的快速回复!我对“使用数据”位有点困惑。这是否意味着“将随机的 MIDI 音符代码放在这里”?如果没有,我对它的归属有点困惑。另外,我也不明白“数据->键”部分。这个位在做什么?再次感谢
  • @user2366293,我对midi一无所知。我建议如何使用CreateThread()。如果您是新手,建议您在熟悉 C 之前不要使用线程。 data->key 是成员访问运算符,在这种情况下访问名为 datastruct Thread_data 实例的成员 key
猜你喜欢
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多