Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   EditControl (http://forum.oszone.net/showthread.php?t=58330)

lehha 20-12-2005 11:15 384984

EditControl
 
Добрый день!
Столкнулся с проблемой визуализации (всегда писал консольные приложения).
Итак есть диалоговое окно IDD_DIALOG1, в нем есть editcontrol IDC_EDIT1, обявил объект CEdit *myEdit = new CEdit;, вопрос в следующем как мне связать myEdit и IDC_EDIT1, знаю что это просто)
Спасибо за рание.

pva 21-12-2005 14:57 385410

IDC_EDIT1 - это скорее всего его Control ID. Скорее всего поможет:
Код:

edit1->AttachHandle(GetDlgItem(hdlg, IDC_EDIT1));
если имеется ввиду MFC

lehha 21-12-2005 15:11 385418

Да я пробовал так но у меня мало, что получилось, тогда я нашел в MSDN DoDataExchange(CDataExchange* pDX), проблема решилась сама собой..))
Но сейчас возникла другая(
При нажатии кнопки ну скажем Ок у меня начинает выполнятся функция которая выводит результат своего действия как раз в этот Edit Control, но результат выводится по завершению работы функции. Искал что можно сделать, нашел что нужно как то создать отдельный поток для этой функции, в MSDN нашел
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
Кто нить работал с этим “зверем”, помогите если есть опыт работы с подобными вещами, а то времени жалко пока до самого дойдет.
Спасибо за ранние.

pva 22-12-2005 08:57 385706

Код:

void __stdcall foo(void*)
{
    ...
}

DWORD id;
HANDLE hthr;

hthr = CreateThread(0, 0x1000, foo, 0, 0, &id);

Не советую с ним работать, т.к. он не инициалицирует библиотеки C и C++. Лучше #include <process.h> _beginthread
Код:

_beginthread(foo, 0x1000);

lehha 22-12-2005 09:33 385721

pva
_beginthread работает только с "отдельными" функциями, а у меня метод класса, если его определять как static, то это переписывать весь код и извращятся с передачей указателя на класс((, есть ли функции работающие с методами класса??

pva 22-12-2005 11:37 385760

Проще простого:
Код:

class Thread
{
    HANDLE hthread;

    static __stdcall gmain(Thread* thr)
    {
          try
          {
                thr->main();
          }
          catch(...)
          {
                abort();
          }
    }

public:
    Thread() : hthread() {}
    ~Thread() {CloseHandle(hthread);}

    void start()
    {
          // раздельно от конструктора, чтобы дать построиться синхронно.
          // уничтожать лучше тоже синхронно, т.е. сборщиком мусора.
          // не желательно объявлять Thread автоматической переменной.
          // я про параметр просто забыл в аргументах написать
          hthread = (HANDLE)_beginthread((void(*)(void*))gmain, this, 0x1000);
    }

protected:
    virtual void main() = 0;
};

...

class MyThread : public Thread
{
    void main()
    {
          ...
    }
}

MyThread* my_thread = new MyThread();
my_thread->start();

Но по-моему, лучше сделать static MyThread::start(Thread*), которая запускает поток и вписывает его в список сборщика мусора (В своём классе я так и сделал).

pva 22-12-2005 11:45 385763

А ещё вот как придумал:
Код:

struct thr_start_struct
{
    Object* obj;
    void (Object*::mbr)();
};

void threaded_proc(thr_start_struct* st)
{
    (st->obj->*st->mbr)();
}

void start_threaded(Object* obj1, void (Object*::mbr1)())
{
      thr_start_struct st;
      st.obj = obj1;
      st.mbr = mbr1;
      _beginthread((void(*)(void*))threaded_proc, &st, 0x10000);
}

...


class A : public Object
{
    void priv_foo()
    {
          ...
    }
public:
    void foo()
    {
        ...
    }

    void parallel_it()
    {
          start_threaded(this, (void(Object::*)())priv_foo);
    }
};

start_threaded(this, (void(Object::*)())foo);

Но такой подход не позволяет управлять потоком (А также синхронизироваться).

lehha 22-12-2005 12:15 385787

Спасибо огромное буду пробовать

lehha 22-12-2005 16:25 385885

Итак сделал следующее:
Код:

class CDlg : public CDialog
{
public:
        .
        .
        .
        void SetEditString(CString cStr);
        friend DWORD WINAPI FGetInfo(HANDLE lpParam);
        afx_msg void OnStart(void);
        .
        .
private:
        HANDLE hThread;
        DWORD dwThreadId;
        DECLARE_MESSAGE_MAP();
       
};
        .
        .
        .
void CDlg::OnStart()
{
        hThread = CreateThread(NULL,NULL,FGetInfo,this,0,&dwThreadId);
}
        .
        .
        .
DWORD WINAPI FGetInfo(HANDLE lpParam)
{
        .
        .
        .
//пытаюсь обратиться к указателю и вызвоть метод класса
lpParam->SetEditString(asd);
        .
        .
        .
}

на что мне компилятор ругается
error C2227: left of '->SetEditString' must point to class/struct/union
type is 'HANDLE'
В чем моя ошибка, как я понимаю hThread = CreateThread(NULL,NULL,FGetInfo,this,0,&dwThreadId); передает this и потом я могу через него обращятся к членам класса, или я заблуждаюсь??
Поправте меня плиз.


lehha 23-12-2005 13:29 386138

Победил это так:
Код:

DWORD WINAPI FGetInfo(LPVOID lpParam)
{
        CDlg *myDlg = (CDlg*)lpParam;
...
...
        myDlg->SendMessage(WM_MYMESSAGE,WPARAM("Сообщение"),0);
...
}

в обработчике сообщение прописал
Код:


#define WM_MYMESSAGE (WM_USER+100)
....
....
BEGIN_MESSAGE_MAP(CDlg, CDialog)

        ON_MESSAGE(WM_MYMESSAGE, OnUpdate)
END_MESSAGE_MAP()

и
Код:


LRESULT CDlg::OnUpdate(WPARAM wParam,LPARAM lParam)
{
        m_pEdit+=(LPCTSTR)wParam;
        m_pEdit+="\r\n";       
        UpdateData(FALSE);
        return 0;
}

Все заработало)
Спасибо всем.


Время: 12:27.

Время: 12:27.
© OSzone.net 2001-