Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4

Зависает форма при создании потока

29.03.2014, 11:58. Показов 2997. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане.

Вчера тестировал работу 200 одновременных потоков на C++ Builder 6, все работало отлично.
Сегодня форма стала зависать при нажатие на кнопку. Пересоздал проект, сделал 1 поток и все равно зависает. В чем может быть проблема?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <process.h>
 
unsigned __stdcall proc1(void *args)
{
    char *name = (char *) args;
    MessageDlg(name, mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0);
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   unsigned t1;
   char *tname1 = "Thread A";
   HANDLE h1 = (HANDLE) ::_beginthreadex(0, 0, &proc1, tname1, CREATE_SUSPENDED, &t1);
 
   if ( h1 == NULL )
        MessageDlg("error", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0);
 
   ::ResumeThread(h1);
   ::WaitForSingleObject(h1, INFINITE);
   ::CloseHandle(h1);
}
Добавлено через 8 минут
Такой вариант работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
void proc2(void *args)
{
    char *name = (char *) args;
    Form1->Caption = name;
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   unsigned t1;
   char *tname1 = "Thread A";
   _beginthread( proc2, 0, (void *) tname1  );
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2014, 11:58
Ответы с готовыми решениями:

Модальная форма появляется при создании приложения
В приложении множество модальных форм, но вдруг одна из них стала появлятся при создании приложения. Отображается она за главной формой....

Зависает форма при загрузке DLL
Я написал функцию и поместил ее в DLL.Если загружать эту DLL из программы которая открыта в билдере то функция работает,а если запустить...

Ошибка при создании потока
An unhandled exception of type 'System.ArgumentException' occurred in WindowsBase.dll Additional information: Необходимо создать...

12
29.03.2014, 17:08

Не по теме:

Открой для себя TThread и инструменты для синхронизации: TThread::Synchronize(), TIdNotify, TIdSync, TCriticalSection, TSimpleEvent идр.

0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
29.03.2014, 18:58  [ТС]
Avazart, меня интересует CreateProces и возврат значения из потока, все перечисленное в моем случае не отребуется.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.03.2014, 19:42
Тебе лучше знать, хочешь подвисаний - получай...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
29.03.2014, 20:10
QVO, не стоит так делать по двум причинам.

Во-первых, любые несинхронизированные обращения к объектам из других потоков - это русская рулетка, никогда не знаешь, когда пальнет. В случае с объектами из библиотеки VCL, такими как Form1->Caption, например, возможен только один - исключительно один вариант - обращения к ним должны производиться из главного потока. Это значит, либо слать сообщения форме, либо использовать Synchronize(), как уже и было предложено.

Во-вторых, у тебя идет передача в параметрах указателя на статический объект, живущий в стэке - tname1. Это потенциальная порча информации или access violation, как только сложатся подходящие условия. Тут либо передавать в поток самодостаточную копию информации, либо давать ему наводку на источник информации, живущий не меньше, чем сам поток, возможно с синхронизацией, если к этому источнику будет обращаться более одного потока.
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
29.03.2014, 21:30  [ТС]
Действительно, проблема заключалась в обращение к форме приложения.
BRcr, такие проблемы не возникнут при создание динамически компонентов Indy внутри потока?

C++
1
2
3
4
5
6
DWORD WINAPI Add(void* param)
{
    int ptr = (int)param;
    ptr++;
    return ptr ;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    for ( int i = 0; i < thcnt; i++ )
    {
        aThread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Add, (void*)i, 0, &dwIdAdd);
        if( aThread[i] == NULL )
            Form1->Memo1->Lines->Add("Поток не создался: "+IntToStr(i));
 
    }
 
    WaitForMultipleObjects(thcnt,aThread,TRUE,INFINITE);
 
    DWORD iRetVal;
    for ( int i = 0; i < thcnt; i++ )
        if(GetExitCodeThread(aThread[i], &iRetVal))
            Form1->Memo1->Lines->Add("Ответ с потока: "+IntToStr(iRetVal));
 
    for( int i = 0; i < thcnt; i++ )
        CloseHandle(aThread[i]);
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.03.2014, 22:28
Цитата Сообщение от QVO Посмотреть сообщение
такие проблемы не возникнут при создание динамически компонентов Indy внутри потока?
Те же что и обычно - синхронизация, точнее ее отсутствие.

Сколько можно упрямо пытаться запихнуть в VCL CreateThread() ?
Не ужели не понятно что нельзя глупо так делать?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
30.03.2014, 12:03
Там же у indy какие-то свои встроенные примочки на потоки есть, типа как ttread для vcl? Лучше воспользоваться ими.
Просто я крайне плохо знаю indy...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.03.2014, 15:07
BRcr, Встроенного ничего нет как раз, но есть инструменты TIdNotify, создание и удаление объекта этого класса
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
31.03.2014, 13:04  [ТС]
Avazart, проект я вскоре собираюсь портировать на QT и Linux. Разбираться в TThread для демо-проекта нет желания, но видимо придется.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2014, 13:49
Да и как ты собираешься CreateThread() портировать в Linux ?

Пиши сразу в Qt c применением тамашних инструментов, и не парь людям голову, тут в разделе С++Builder
0
 Аватар для QVO
652 / 462 / 80
Регистрация: 26.10.2010
Сообщений: 1,263
Записей в блоге: 4
31.03.2014, 14:49  [ТС]
Avazart, если тебя парят темы не соответствующие
C++
1
int a = StrToint(Edit1->Text);
то зачем их просматривать?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.03.2014, 17:17
Меня парит в обще подобный маразм,ибо маразм не может не парить.
Почему вы вообще не пишете на Java, а потом портируете на C# а затем в С++Builder, и только потом в Qt под Linux ? Так ведь проще судя по вашей кривой логике?

Еще больше парит постановка вопроса, не соответствующего разделу.
Уж пордон, никто не любит глупых вопросов, кроме глупых людей которые их задают.
Вот к чему уважаемый BRcr, и я тратили время и распинались про синхронизацию и TThread ?
К тому что Вы сказали что мол, пох на С++Builder все равное это Г буду портировать на Qt под Linux?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2014, 17:17
Помогаю со студенческими работами здесь

Ошибка при создании потока
Почему возникает ошибка: 1&gt;c:\users\егор\desktop\fun_to__\fun_to__\fun+\dir\mainfile.h(17) : error C2664: _beginthread: невозможно...

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

Вылетает при создании потока
При выключенном Bluetooth, запуская приложение у меня включается блютуз, но выдаёт ошибку создания потока: 02-15 13:31:26.111...

Ошибка при создании потока
uses System.Threading; procedure Add(); begin for var i := 0 to 9 do Writeln(i); end; begin var T := new...

NullPointerException при создании нового потока
Привет всем! Пытаюсь создать новый поток: создаю экземпляр класса, который реализует интерфейс Runnable. Пытаюсь создать экземпляр...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru