Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateThread - передаём параметр... не работает передача параметра в функцию 
V
    Опции темы
sOckets
Дата 26.8.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Код

void exec_cmd(char *cmd) // cmd у меня что-то типо "get_http+1file" и тд
{
HANDLE F = CreateThread(NULL, NULL, WriteFile, (char *)cmd, NULL, NULL);
}

DWORD WINAPI WriteFile(LPVOID lpParam)
{
        char *g_cmd = (char *) lpParam; 
        MessageBox(0,g_cmd,g_cmd,0);
}

Так вот MessageBox ничего не показывает , то есть пустые окошки , как будто g_cmd пуст

Это сообщение отредактировал(а) ilovewinsocks - 26.8.2006, 23:24


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
dumb
Дата 26.8.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



хм. вроде компилер должен ругнуться на передаче (char*) в CreateThread...
основное подозрение - строка находится в стековой переменной одной из процедур вызывающих exec_cmd и на момент запуска потока уже не существует.
PM MAIL   Вверх
sOckets
Дата 26.8.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



компиль молчит как портизан


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
0x00
Дата 27.8.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



вот рабочий код:


Код

#include <windows.h>

DWORD WINAPI thre(LPVOID lpParam){    
    char *g_cmd = (char*)lpParam;
    MessageBox(0,g_cmd,g_cmd,0);
    return 1;
}

void main(void){
    char *cmd="test";
    CreateThread(NULL, NULL, thre, (void*)cmd, NULL, NULL);
    Sleep(3000);
}


Добавлено @ 00:52 

PS: кстати есть такая ф-ция WriteFile... может компилер принял твою ф-цию за нее?
PM MAIL   Вверх
sOckets
Дата 27.8.2006, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Код

void exec_cmd(char *cmd) // cmd у меня что-то типо "get_http+1file" и тд
{
char NEW[200];
strcpy(NEW,cmd);
HANDLE F = CreateThread(NULL, NULL, WriteFile,NEW, NULL, NULL);
}

DWORD WINAPI WriteFile(LPVOID lpParam)
{
        MessageBox(0,(char*)lpParam,(char*)lpParam,0);
}

закрываем тему


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Damarus
Дата 27.8.2006, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Цитата(ilovewinsocks @  27.8.2006,  01:56 Найти цитируемый пост)
закрываем тему

Вот тебе информация к размышлению:
Код

#include <windows.h>
#include <iostream>

DWORD WINAPI WriteFile(LPVOID lpParam)
{
    MessageBox(0, (wchar_t*)lpParam, (wchar_t*)lpParam, 0);
    return 0;
}

void exec_cmd(wchar_t *cmd) // cmd у меня что-то типо "get_http+1file" и тд
{
    wchar_t NEW[200];
    wcscpy(NEW, cmd);
    HANDLE F = CreateThread(NULL, NULL, LPTHREAD_START_ROUTINE(WriteFile),
        NEW, NULL, NULL);
    CloseHandle(F);
}

int wmain(int argc, wchar_t *argv[], wchar_t *envp[])
{
    exec_cmd(L"Hello world!");
    exec_cmd(L"------------");

    Sleep(10000);
}


Добавлено @ 01:15 
Цитата(dumb @  26.8.2006,  23:07 Найти цитируемый пост)
основное подозрение - строка находится в стековой переменной одной из процедур вызывающих exec_cmd и на момент запуска потока уже не существует.

Согласен.


Это сообщение отредактировал(а) Damarus - 27.8.2006, 01:18
PM MAIL ICQ Jabber   Вверх
sOckets
Дата 27.8.2006, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Код

test.cpp
test.cpp(6): warning #167: argument of type "wchar_t={unsigned short} *" is inco
mpatible with parameter of type "LPCSTR={const CHAR={char} *}"
      MessageBox(0, (wchar_t*)lpParam, (wchar_t*)lpParam, 0);
                    ^

test.cpp(6): warning #167: argument of type "wchar_t={unsigned short} *" is inco
mpatible with parameter of type "LPCSTR={const CHAR={char} *}"
      MessageBox(0, (wchar_t*)lpParam, (wchar_t*)lpParam, 0);
                                       ^

Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

-out:test.exe
test.obj
test.obj : error LNK2001: unresolved external symbol __imp__MessageBoxA@16
test.exe : fatal error LNK1120: 1 unresolved externals

честное слово мне сейчас не до этого...скажи что ты хотел сказать этим и всё.


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Damarus
Дата 27.8.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Цитата(ilovewinsocks @  27.8.2006,  04:28 Найти цитируемый пост)
честное слово мне сейчас не до этого...скажи что ты хотел сказать этим и всё.

В коде, который я привёл, видно, что запускаются два потока с разными строками ("Hello world!" и "------------"). Соответственно, должны появиться два MessageBox'а с этими строками. Так вот, в реальности, в обоих MessageBox'ах будет "------------" (проверено на VS2005 Debug и Release). Происходит это потому, что переменная NEW локальная и второй вызов exec_cmd затирает её первое значение.

PS. По поводу ошибок. Просто у меня UNICODE проект, а у тебя нет. Замени wchar_t на char, wmain на main, wcscpy на strcpy и 
Код

exec_cmd(L"Hello world!");
exec_cmd(L"------------");

на
Код

exec_cmd("Hello world!");
exec_cmd("------------");

PM MAIL ICQ Jabber   Вверх
sOckets
Дата 27.8.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



да нет , там же просто варнинги , скомпилелось нормально , MessageBox 2 раза мне показал "-" , теперь я понял о чём ты.
Спасибо большое.


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Fixin
Дата 28.8.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Цитата(Damarus @  27.8.2006,  01:13 Найти цитируемый пост)
Код
exec_cmd(L"Hello world!");
exec_cmd(L"------------");
Во избежание такой проблемы, как путаница с блоками памяти, то для каждого вызова создания потока нужно пользоваться ф-цией GlobalAlloc (или другими ф-циями менеджмента памяти), и вот сюда
Цитата(Damarus @  27.8.2006,  01:13 Найти цитируемый пост)
Код
void exec_cmd(wchar_t *cmd) // cmd у меня что-то типо "get_http+1file" и тд
{
    wchar_t NEW[200];
    wcscpy(NEW, cmd);
    HANDLE F = CreateThread(NULL, NULL, LPTHREAD_START_ROUTINE(WriteFile),
        NEW, NULL, NULL);
    CloseHandle(F);}
нужно передовать уже готовый адрес,  а не создавать локальную переменную с единым адресом, те должно быть так:
Код
#include <windows.h>
#include <iostream>

DWORD WINAPI WriteFile(LPVOID lpParam)
{
    MessageBox(0, (wchar_t*)lpParam, (wchar_t*)lpParam, 0);
    return 0;
}

void exec_cmd(wchar_t *cmd) // cmd у меня что-то типо "get_http+1file" и тд
{
    HANDLE F = CreateThread(NULL, NULL, LPTHREAD_START_ROUTINE(WriteFile),
        cmd, NULL, NULL);
    CloseHandle(F);
}

int wmain(int argc, wchar_t *argv[], wchar_t *envp[])
{
    wchar_t* GlobalBlock = (wchar_t*)GlobalAlloc(GPTR, 200*sizeof(wchar_t));
    wcscpy(GlobalBlock, L"Hello world!");

    wchar_t* GlobalBlock2 = (wchar_t*)GlobalAlloc(GPTR, 200*sizeof(wchar_t));
    wcscpy(GlobalBlock2, L"------------");

    exec_cmd(GlobalBlock);
    exec_cmd(GlobalBlock2);

    Sleep(10000);

    GlobalFree(GlobalBlock);
    GlobalFree(GlobalBlock2);
}


Это сообщение отредактировал(а) Fixin - 28.8.2006, 10:30
PM MAIL ICQ   Вверх
Damarus
Дата 28.8.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 4
Всего: 29



Fixin, полностью согласен.
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.