Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 08.01.2013
Сообщений: 42

Ошибка потока, неверный дескриптор 6

26.10.2013, 15:19. Показов 5403. Ответов 29
Метки нет (Все метки)

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

Ситуация в следующем. Есть основная форма, на карта gistoolkit. При перемещении курсора мыши должен производиться рассчет в зависимости от координат.
В классе потока расположены функции рассчета.
Реализовал следующим образом
Главная форма
------------
C++
1
2
3
4
Главнаяформа::MouseMove
{
КлассПотока->Функциядляконвертации(х, у); // (указатель уже создан ранее вида КлассПотока = new TКлассПотока(true));
}
---------------
Класс Потока
C++
1
2
3
4
5
6
7
8
9
10
11
12
КлассПотока::Функциядляконвертации(х, у)
{
Записвыемвглобальную переменную координаты x, у;
Resume;
}
 
КлассПотока::Execute
{
Считыаем данные из глобальной переменной и пересчитываем с помощью функции рассчетов.
Записываем в другую переменную.
Suspend;
}
И далее функции в классе котороые именно в потоке не используются но по этой тематике.

При данной схеме рассчет идет, все в порядке, но через которое время вылетает ошибка неверный дескриптор 6 и указатель на "Resume";
Если использовать Terminate то поток выполняется один раз, ну это и понятно ведь запущен один раз он.
Если создавать класс динамически например в Главная форма :: MouseMove или КлассПотока::Функциядляконвертации(х, у) (вида TКлассПотока * КлассПотока2 = new TКлассПотока(true)) и прописывать Terminate вместо Suspend, то рассчет происходит только 252 раза затем считать отказывается.
Если крутить мышкой дальше видно что программа начинает подвисать и в итоге ошибка недостаточно памяти. Понимаю что динамически созданных классов много получается но разве они не должны удалиться при проходе функции?

Подскажите пожалуйста как правильно построить приложение?
Задача, чтобы в класс кидались данные координаты, и запускался поток, при это в классе должны функции связанные с рассчетом координат которые не используются в потоке.

p.s. прошу прощения за код, выложить его возможности нет, написал "схематично".
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2013, 15:19
Ответы с готовыми решениями:

Почему возникла ошибка System Error 6. Неверный дескриптор
Есть 5 потоков, нужно чтобы они вычислялись паралельно, но если пользователь в checkbox выбирает, то они должны вычисляться...

Потоки Thread Error Неверный дескриптор (6)
Генерирую ключи к алгоритму RSA в отдельном потоке. 1 раз поток работает нормально, при попытке новой генерации выдает ошибку Thread Error...

Параметры SQL (:Par) ошибка EOleException with message 'Аргументы имеют неверный тип, выходят за пределы'
У меня ХЕ4. работаю с mysql Изначально ошибка возникла когда я взял примеры кода отсюда, с insert поле blob через параметр ...

29
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2013, 20:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _Dimon_ Посмотреть сообщение
Это да, но запускать эго в конструкторе не обязательно
А где тогда запускать его по вашему ?
0
1409 / 573 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
27.10.2013, 20:56
Можно запустить на OnMouseEnter той карты (или что там), с которой работает ТС, и освободить в OnMouseLeave
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2013, 20:58
Цитата Сообщение от _Dimon_ Посмотреть сообщение
Можно запустить на OnMouseEnter той карты (или что там), с которой работает ТС, и освободить в OnMouseLeave
Через Suspend/Resume ?

Я к тому что говорил раньше - пересмотреть алгоритм.

Зачем гонять поток во время движения мыши? Когда данные постоянно меняются и перестают быть актуальными ...
Может допустимо "запустить в работу" поток при остановке мыши например на после 3 секунд простоя после движения.
0
1409 / 573 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
27.10.2013, 21:00
Нет, создавать функцией Start_thread() и убивать Stop_thread()
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.10.2013, 21:04
Хорошо, если пользователь остановит курсор на карте и так его и оставит, что будет ?
Зачем нужно будет гонять в это момент в цикле глупых вычислений ?
0
1409 / 573 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
27.10.2013, 21:04
Вот на TImage попробовал - все отлично работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::Image1MouseEnter(TObject *Sender)
{
 Start_thread();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseLeave(TObject *Sender)
{
 Stop_thread();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
 Set_thread(StrToInt(Edit1->Text));
}
0
2 / 2 / 0
Регистрация: 08.01.2013
Сообщений: 42
27.10.2013, 21:13  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Блин, вы читать умеете ?

FormMouseMove вызывается сотни раз во время того как вы ведете мышью! То есть вы пытаетесь создать и запустить 100-ни потоков? Что должно происходить по вашему ?
То есть по коду который я указывал раньше создавалась большое количество потоков и не успевало удалиться поэтому не хватало памяти? Или они не удалялись, а накапливались?
Как можно мониторить количество активных потоков?
0
1409 / 573 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
27.10.2013, 22:18
Теперь в холостую не работает
*.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
 
TestThread *test;
//---------------------------------------------------------------------------
__fastcall TestThread::TestThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void  TestThread::SaveCount(int Count)
{
 CountDo = Count;
}
//---------------------------------------------------------------------------
void __fastcall TestThread::Execute()
{
 FreeOnTerminate = true;
 //NameThreadForDebugging(UnicodeString(L"Test"));
 
 while (!Terminated)
  {
   CountPosle = Raschet(CountDo);
   Synchronize(Result);
   Suspend(); //Suspended = true;
  }
 
}
//---------------------------------------------------------------------------
int  TestThread::Raschet(int Count)
{
 int result;
 result = Count + 10;
 return result;
}
//---------------------------------------------------------------------------
void __fastcall TestThread::Result()
{
 Form1->Edit2->Text = IntToStr(CountPosle);
 //Form1->Edit3->Text = StrToInt(Form1->Edit3->Text)+1;
}
//---------------------------------------------------------------------------
//----------------------- обертки над потоком -------------------------------
//---------------------------------------------------------------------------
void __fastcall Start_thread()
{
 test = new TestThread(false);
}
//---------------------------------------------------------------------------
extern void __fastcall Stop_thread()
{
 if(test)
  {
   test->Resume(); //Suspended = false;
   test->Terminate();
  }
 test = NULL; //на всякий пожарный
}
//---------------------------------------------------------------------------
extern void __fastcall Set_thread(int Count)
{
 if (test)
  {
   if (test->Suspended) test->Resume(); //Suspended = false;
   test->SaveCount(Count);
  }
}
//---------------------------------------------------------------------------

*.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
class TestThread: public TThread
{
private:
public:
  __fastcall TestThread(bool CreateSuspended);
  //__fastcall ~TestThread();
  void __fastcall Execute();
  int Raschet(int Count);
  void  SaveCount(int Count);
  void __fastcall Result();
  int CountDo, CountPosle;
};
//---------------------------------------------------------------------------
extern void __fastcall Start_thread();
extern void __fastcall Stop_thread();
extern void __fastcall Set_thread(int Count);
//---------------------------------------------------------------------------
#endif
Добавлено через 1 минуту
lex_qt, какой у тебя билдер?
1
2 / 2 / 0
Регистрация: 08.01.2013
Сообщений: 42
28.10.2013, 21:54  [ТС]
_Dimon_, большое спасибо за помощь! Помогло. Builder 6
Исправил только
C++
1
2
3
4
5
6
7
extern void __fastcall Set_thread(int Count)
..
   test->SaveCount(Count);
   if (test->Suspended) test->Resume(); //Suspended = false;
..
  }
}
т.к. последние отправленные данные не считал, только предпоследние. Запускался поток а потом шло сохранение параметров.
Еще объединил Start_thread() и Set_thread(int Count), чтобы сразу добавить его в MouseMove
C++
1
2
3
4
5
6
7
extern void __fastcall Set_thread(int Count)
{
 if (!test)
 test = new TestThread(false);
 test->SaveCount(Count);
 if (test->Suspended) test->Resume(); //Suspended = false;
}
Надеюсь эта тема еще кому нибудь поможет.
0
1409 / 573 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
28.10.2013, 22:40
Я спросил какой билдер потому что с RAD 2009(или с 2010) методы Resume и Suspend считаются устаревшыми. Вместо них нужно использовать свойство Suspended
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2013, 22:40

Закрытие потока - ошибка "Неверный дескриптор"
Здравствуйте, форумчане. есть программа:# include &lt;stdio.h&gt; # include &lt;math.h&gt; # include &lt;stdlib.h&gt; # include &lt;conio.h&gt; #...

Ошибка неверный дескриптор
При запуске приложения возникает данная ошибка, помогите разобраться:-|

Ошибка: Неверный дескриптор (6)
Здравствуйте, пытаюсь сделать экспорт в базу данных. При выполнении возникает ошибка &quot;Неверный дескриптор (6)&quot;, хотя раньше её не...

Что значит эта ошибка "Неверный дескриптор файла"
Делфи на Паскале выдаёт мне ошибку N6. (6 Неверный дескриптор файла (Invalid file handle)) Помогите!!!! Что это значит ??? Вот мой...

Виртуальная машина на JScript, ошибка "Неверный дескриптор"
Пытаюсь написать простую виртуальную машину на JScript. Надо придумать свой низкоуровневый язык и написать интерпретатор. Написано два...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru