2

_beginthead() を使用してスレッドを開始しています。文字列と 2 つの int の 3 つのパラメーターをスレッドに渡す必要があります。これが私が持っているものであり、これは決してプログラム全体ではなく、問題とは関係のないものをいくつか取り出しました(私の実際のプログラムでは main は実際にはメインではなく、それは単なる通常の機能です):

typedef struct ST
{
    char *ip;
    int port;
    int dur;
}thestruct;  

void main(char **arg_p, int arg_count)
{
    char *ip;
    int port, duration;
    ip = (char *)malloc(sizeof(char));
    ip = arg_p[0];
    port = atoi(arg_p[1]);
    duration = atoi(arg_p[2]);

    thestruct *st;
    st = (thestruct *)malloc(sizeof(thestruct));
    st->dur = duration;
    st->ip = (char *)malloc(sizeof(char));
    st->ip = ip;
    printf("ip: %s\n", st->ip);
    st->port = port;

    _beginthread((void(*)(void*))connect, 0, (void*)st);
}

void connect(thestruct *s)
{
    Sleep(100);
    char *ip = static_cast<char*>(s->ip);
    int port = s->port;
    int dur = s->dur;
    printf("ip: %s\nport: %i\ndur: %i", ip, port, dur);
    _endthread();
}

文字列 ip がスレッドに正しく渡されていないことを除いて、すべてがうまく機能しています。最初の printf 呼び出しで ip が完全に出力され、スレッド内で "ip: " が出力され、その後は空白になります。次に、新しい行に移動し、ポートと期間を完全に出力します。

ほとんどの人は1つの文字列などを渡すだけでよいため、私はこの問題のトピックをしばらく調査していましたが、役に立ちませんでした。したがって、グーグルで見つけられるのは、単一の文字列を渡す人だけであり、もちろんそれは機能します。

たとえば、「127.0.0.1 1234 25」を渡します。また、私が言ったように、2 つの整数が完全に機能し、文字列にエラーが発生していないため、構造体に問題はないようです。渡されていないだけです。

とにかく、誰かがこのトピックに光を当てることができれば、それは素晴らしいことです.

4

2 に答える 2

1

主な問題は、印刷を実行して印刷したものをフラッシュmain()する前に終了することです。connect()


これに加えて:

int main(int, char **)

その逆ではありません。


もう 1 つの問題は、スレッド関数が次のように定義されていることです。

void * (*)(void *)

したがって、次のようになります。

void * connect(void * pv)  
{
  thestruct * s = pv;
  ...

また

st->ip = ip;

割り当てによって返された直前のアドレスを上書きします。

文字をコピーした方がよいでしょう:

strcpy(st->ip, ip);

この行

ip = (char *)malloc(sizeof(char));

ip次の行で上書きされるため、冗長です。

ip = arg_p[0];
于 2012-11-22T21:58:43.140 に答える
0

私の仮定はmain、問題を引き起こしているのはあなたの定義であるということです:

void main(char **arg_p, int arg_count)

voidであるはずの事実は別intとして、最初の引数は引数の数であると想定され、残りは引数です。それらを切り替えてみてください:

void main(int arg_count, char **arg_p)
于 2012-11-22T22:00:17.187 に答える