Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 865
Записей в блоге: 1
1

Необработанное исключение типа "System.InvalidOperationException"

20.02.2014, 14:31. Показов 1852. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день уважаемые форумчане!
Нужна ваша помощь. Ошибка такова: попытка доступа к элементу управления не из того потока, в котором он был создан. Я сделал следующее: создал делегат и передал в dll как указатель на функцию. Здесь ошибок нет. И если из функции Dll обращаться к указателю функции все работает нормально, но функция библиотеки создает поток, для контроля за состоянием, и при попытке вызвать из него указатель на функцию вылетает ошибка. Понял что нужно использовать invoke, но не разобрался как.

код вызова из процедуры программы (часть):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef void (*ClProc)(int);
public delegate void MyDel(int i);
....
   void prbar(int ps)
    {
 
        pBar->Value=ps;
        frmMain::Update(); 
    }
.......
MyDel ^md;
ClProc c_b;
md=gcnew MyDel(this, &frmMain::prbar);  
GCHandle gch = GCHandle::Alloc(md);
IntPtr i_p = Marshal::GetFunctionPointerForDelegate(md);
c_b = static_cast<ClProc>(i_p.ToPointer());
GC::Collect();
er1=GridCalc(&gis1,grid,&dI, c_b);//Обращение к функции dll
gch.Free();
И код dll
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
typedef void (*ClProc)(int);
int nM, *n_p;
bool st_p, st_p1;
ClProc pr1;
 
void TestTheard( )
{
    int *nt;
    int pc, nt1;
    double n1;
    nt=(int*)malloc(sizeof(int));  
    *nt=0;  
 
    nt1=0;
    while (st_p)
    {
        if (cudaMemcpy(nt,n_p ,sizeof(int),cudaMemcpyDeviceToHost)==cudaSuccess)
        { 
            n1=floor(*nt*100.0/nM);
            pc=static_cast< int >(n1);
            if (pc!=nt1)
            {
                pr1(pc);
                nt1=pc;
            }
        }
        Sleep(50); 
    }
    free(nt);
st_p1=false;
}
....
pr1=c_b; //Код вызова из функции
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE )&TestTheard, NULL, 0, &dwThreadId);
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2014, 14:31
Ответы с готовыми решениями:

Необработанное исключение типа «System.ArgumentOutOfRangeException» произошло в mscorlib.dll
Необработанное исключение типа «System.ArgumentOutOfRangeException» произошло в mscorlib.dll...

Ошибка: Необработанное исключение типа "System.IO.FileNotFoundException"
Добрый день. Пытаюсь в своем приложении использовать частично логику другого приложения. ...

Ошибка: Необработанное исключение типа "System.StackOverflowException"
начал разбираться с этим направлением. написал вот такой код int inmas; int onemas ; ...

Помогите найти ошибку (Необработанное исключение типа "System.ArgumentException")
Здравствуйте! Пытаюсь сделать функцию, которая в mp3 файле находит tag: &quot;TIT2&quot; и выводит его в...

Необработанное исключение типа "System.IndexOutOfRangeException"
Пишу программу которая находит все слова в переданном тексте которые заканчиваются на согласную....

2
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.02.2014, 17:10 2
Лучший ответ Сообщение было отмечено mustimur как решение

Решение

Цитата Сообщение от mustimur Посмотреть сообщение
нужно использовать invoke, но не разобрался как.
Вариант на шарпе, но я думаю, разберетесь:
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void UpdateCtrl()
{
   if (ctrl.InvokeRequired)
   {
      MethodInvoker d = new MethodInvoker(UpdateCtrl);
      ctrl.BeginInvoke(d); 
   }
   else
   {
      ctrl.MyMethod();
   }
}
1
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 865
Записей в блоге: 1
20.02.2014, 18:32  [ТС] 3
Tulosba, Разобрался, вот что значит дать пинок в нужном направлении. Но код корявый вышел:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void rePrbar ()
{
            pBar->Value=ps1;
            frmMain::Update(); 
}
 
   void prbar(int ps)
    {
        ps1=ps;
        if (this->InvokeRequired)  
        {
            MethodInvoker^ d= gcnew MethodInvoker(this, &frmMain::rePrbar);
            this->BeginInvoke(d); 
        }
        else
        {
        rePrbar ();
        }
 
    }
т.е. пришлось дополнительно завести глобальную переменную ps1 и процедуру без параметров void rePrbar, (), т.к. MethodInvoker не принимает указатель на процедуру с параметрами (функцию-члена с параметрами). (нет указанного делегата) Это только так сделать можно или я опять намудрил?
0
20.02.2014, 18:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2014, 18:32
Помогаю со студенческими работами здесь

Необработанное исключение
Прога завершается с кодом ноль, но выдает такое сообщение

Необработанное исключение: Не удалось загрузить файл или сборку: "SteamWrapper.dll"
Необработанное исключение типа &quot;System.IO.FileNotFoundException&quot;: Не удалось загрузить файл или...

Необработанное исключение типа "System.InvalidOperationException" в System.Data.dll
В программировании нуб. Помогите исправить ошибку. Делал всё по видео-уроку. Но почему то при...

Необработанное исключение типа "System.InvalidOperationException" в EntityFramework.dll
Добрый день! пишу приложение WPF с веб сервисом wfc, в веб сервесе модель базы данных entity...

Необработанное исключение типа "System.InvalidOperationException" в Newtonsoft.Json.dll
Доброго времени суток. Не могу понять по какой причине программа выполняться криво. JObject...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru