Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » CreateThread

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

SHANDLE

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Компилятор правильно ругается, потому что пишите маразм.
 
Вариант 1
void Func1()
{
  myclass mc;
  mc.CreateThreadMethod();
}
 
В этом случае экземпляр myclass (переменные-члены) находится в стеке первого потока.
Что будет делать второй поток с данными стека первого потока? Если просто читать, то ничего, кроме мусора, он оттуда не вытянет. А если решиться что то записать, то испоганит стек первого потока, и первый поток благополучно сдохнет.  
 
Вариант 2
void Func2()
{
  myclass *pmc = new myclass;
  pmc->CreateThreadMethod();
}
 
Теперь экземпляр класса не в стеке. Но нужно будет не забыть удалить его. Тогда проще написать так (без идиотской идеи запускать метод класса отдельным потоком):
 
DWORD WINAPI MyclassThunk(LPVOID lpObj)
{
  myclass *pmc = (myclass*)lpObj;
  pmc->PublicMethod_1();
  pmc->PublicMethod_2();
//  .....
  pmc->PublicMethod_N();
  delete pmc;
  return 0;
}
 
void Func3()
{
  myclass *pmc = new myclass;
  if (pmc)
  {
    HANDLE hThread = CreateThread(0,0,MyclassThunk, pmc, CREATE_SUSPENDED, 0);
    if (!hThread)
    {
      delete pmc;
    }
    else
    {
      ResumeThread(hThread);
      CloseHandle(hThread);
    }
  }
}
 
 

Всего записей: 928 | Зарегистр. 19-01-2007 | Отправлено: 04:52 09-12-2007 | Исправлено: SHANDLE, 04:56 09-12-2007
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тут видимо проблемма с идеологией потоков. Какая собстьв разница для реализации Си я ещё не понимаю. Дело в том, что когда создаётся объект потока, он может запускаться сразу, а может и CREATE_SUSPENDED. Я всегда делаю SUSPENDED так как всегда надо перед работой объекта потока заполнить его поля (члены) (простите за паскаль).
 
My:=TMyThread.Create({suspended}true);
My.FreeOnTerminate:=True;
My.OnDestroy:=DefaultDestr;
My.IterationFunc1:=@Func1;
My.IterationFunc2:=@Func2;
...
My.Scenario:=TMyScenatio1.Create;
My.ProgressBar:=Bar1;
My.Resume;
 
Только так можно реально работать с потоками без проблем. В потоках есть возможность работы без suspended/Resume, но это сделано исключительно для возможности защиты от взломов. Больше этого не надо нигде. А нормально это когда вместе с созданием форм создаются потоки которые вообще My.FreeOnTerminate:=False. Нафига освобождать память при выходе если приложение эту память всё равно освободит? Но когда уже формы созданы и поля заполнены, то перед Application.Run все потоки резюмируются и начинают работать в среде, когда главные формы уже созданы - и никакой мороки. Кучу раз наблюдал исходники, когда эти правила игнорируются и работает всё криво. Но когда чуть чуть навести макияж, то всё начинает пахать как часы.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 19:51 10-12-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » CreateThread


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru