Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/37: Рейтинг темы: голосов - 37, средняя оценка - 4.68
TheSteelRat
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
1

Не работает Synchronize в TThread

25.10.2010, 20:09. Просмотров 6876. Ответов 3
Метки нет (Все метки)

Доброго времени суток!
.h
C++
1
2
3
4
5
6
7
8
9
class TMyThread : public TThread
{
private:
    void __fastcall send_mess();
protected:
    void __fastcall Execute();
public:
    __fastcall TMyThread (bool CreateSuspended);
};
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
__fastcall TMyThread ::TMyThread (bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TMyThread *thread = new TMyThread (true);
        thread ->Start();
}
void __fastcall TMyThread::send_mess() {
ShowMessage("run"); 
Form1->some_lbl->Caption = "work";
}
 
void __fastcall TMyThread::Execute()
{
    FreeOnTerminate = true;
    bool is_error = 0;
    while (!is_error) {
        ShowMessage("run");
        Synchronize(send_mess);
        ShowMessage("runed");
        Sleep(100);
    }
}
Итог: поток стартует, выводится ShowMessage("run"); , а вот функция send_mess не выполняется, и следующая за синхронизацией функция ShowMessage("runed"); тоже не выполняется и вообще цикл перестаёт повторяться.
IDE - RAD 2010.

Добавлено через 25 минут
UPD, это всё работает в DLL.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2010, 20:09
Ответы с готовыми решениями:

Не работает Synchronize() в DLL при сборке без рантайм библиотек
Добрый день. Есть библиотека, в ней есть поток TThread. Библиотека должна...

Вложенный Synchronize
Всем привет! Вопрос по методу Synchronize в TThread. В таком виде она...

Synchronize vs CriticalSection
Вот честно не знаю как работает Synchronize. Суть такая есть класс...

Synchronize ругается
Доброго! Из потока синхронизирую функции через Synchronize, все хорошо. Но...

Synchronize Передача параметров
Приветствую. Как передать параметры в функцию вызываемую методом Synchronize?...

3
MikeSoft
Эксперт С++
3919 / 1784 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
25.10.2010, 22:58 2
TheSteelRat, работоспособный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// хидер (*.h файл)
//---------------------------------------------------------------------------
 
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TTestThread : public TThread
{
private:
  String CurrentText;
  void __fastcall TTestThread::SM();
protected:
  void __fastcall Execute();
public:
  __fastcall TTestThread(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// файл кода (*.cpp файл)
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
__fastcall TTestThread::TTestThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TTestThread::SM() {
  ShowMessage(CurrentText);
}
//---------------------------------------------------------------------------
void __fastcall TTestThread::Execute()
{
  ShowMessage("Started");
  CurrentText = "InThread";
  Synchronize(&SM);
  ShowMessage("Finished");
  //---- Place thread code here ----
}
//---------------------------------------------------------------------------
Вызов:
C++
1
2
3
TTestThread *TestThread = new TTestThread(true);
TestThread->Suspended = false;
TestThread->FreeOnTerminate = true;
0
TheSteelRat
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 36
26.10.2010, 01:51  [ТС] 3
MikeSoft, а это в DLL работает? А то я почитал в интернете, пишут, что в DLL просто не работает Synchronize...
0
DrSMERTb
60 / 36 / 10
Регистрация: 12.11.2010
Сообщений: 820
22.07.2012, 09:13 4
Цитата Сообщение от MikeSoft Посмотреть сообщение
void __fastcall TTestThread::Execute() { ShowMessage("Started"); CurrentText = "InThread"; Synchronize(&SM); ShowMessage("Finished"); //---- Place thread code here ---- }
А вот здесь можно подробнее, у вас выводятся таким образом сообщения из потока? А то у меня ругается если из потока пытаюсь вывести сообщение.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2012, 09:13

Synchronize и тормоза формы
Всем привет! Программа создает несколько потоков, которые записывают результаты...

Synchronize() и события формы
доброго времени суток. пишу чеккер проксей, столкнулся с такой проблемой......

Метод Synchronize выдает ошибку
есть поток, который создается по нажатию клавиши Thr.BrsThr = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru