1

私は C の初心者であり、MIDI シーケンスを実行するプログラムを作成しようとしています。基本的に、2 つの関数があり、両方とも異なる MIDI パターンを実行しており、それらを並行して実行する必要があります。関数の性質 (1 つはシーケンスを実行し、もう 1 つはランダムなノートを再生する) のため、同じ関数で実行することはほぼ 100% 確実です。

pthreads (どうやら Windows では動作しないのですか?) と CreateThread() を使用してこれを行う方法について手がかりを得るためにインターネットを精査してきましたが、動作させることができないようです。私は現在、CreateThread() を使用しようとしており、ランダムな midi シーケンスに必要な整数を取り込もうとしていますが、「LPTHREAD_START_ROUTINE」に関するエラーが発生します。 (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() のことをすべて間違った方法で行っていることであることをよく知っています。

ありがとう!

4

1 に答える 1

4

スレッド エントリ関数のシグネチャは、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);
    }
于 2013-05-09T13:23:06.970 に答える