Форум программистов, компьютерный форум CyberForum.ru

C++ and dll -> нужна консультация на моём примере - C++

Восстановить пароль Регистрация
 
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
15.05.2012, 20:35     C++ and dll -> нужна консультация на моём примере #1
Нужно загрузить несколько классов в dll, а потом, в другом проекте прочитать эти классы из dll и, используя этот dll с помощью механизмов позднего связывания что-нибудь поделать)

Классы есть:
файл.h
C++ (Qt)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#pragma once
 
#include <vector>
#include <algorithm>
#include <time.h>
#include <iostream>
#include <Windows.h>
using namespace std;
 
namespace Sort_Classes{
 
 
class Sort_Basic
{
protected:
    double time;
    long size;
    vector<int>::iterator bi;
    vector<int>::iterator ei;
 
public:
    Sort_Basic(vector<int>::iterator,vector<int>::iterator,long);
 
double Get_Time();
 
template<typename T>
void IsSort(T b, T e)
    {
        bool flag = true;
        --e;
        while (b!= e)
            {
                if (*b>*(++b))
                    {
                        cout<<"ВНИМАНИЕ! Последовательность неотсортирована!<===ERROR";
                        flag = false;
                    }
            }
        if(flag)
            cout<<"Последовательность отсортирована";
    }
 
virtual void Sort()=0;
 
virtual ~Sort_Basic(void);
 
};
 
class Sort_Simple : public Sort_Basic
{
public:
    Sort_Simple(vector<int>::iterator,vector<int>::iterator,long);
 
void Sort();
 
 
};
 
class Sort_2thread_Basic : public Sort_Basic
{
protected:
    vector<int>::iterator avei;
    vector<int>& aim;
    
    /*Sort_2thread_Basic(vector<int>::iterator,vector<int>::iterator,long);*/
    Sort_2thread_Basic(vector<int> &);
 
 
void half_sort();
static DWORD WINAPI Potok_Sort(void *);
 
public:
void Sort();
 
};
 
class Sort_2t_1tM : public Sort_2thread_Basic
{
public:
    Sort_2t_1tM(vector<int> &);
 
void Sort();
};
 
class Sort_2t_2tM : public Sort_2thread_Basic
{
protected:
    vector<int>::iterator IT1;
    vector<int>::iterator IT2;
    long elem_size1;
    long elem_size2;
    vector<int>::iterator helper_it_begin;
 
static DWORD WINAPI Potok_Divide(void *);
static DWORD WINAPI Merge_Help(void *);
public:
    Sort_2t_2tM(vector<int> &);
 
void Sort();
 
 
};
 
    }
файл.cpp
C++ (Qt)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "StdAfx.h"
#include "Sort_Basic.h"
 
namespace Sort_Classes{
 
Sort_Basic::Sort_Basic(vector<int>::iterator b,vector<int>::iterator e, long size_)
    {
        bi = b;
        ei = e;
        size = size_;
    }   
 
double Sort_Basic::Get_Time()
{
    return time;
}
 
 
Sort_Basic::~Sort_Basic(void)
    {
    }
 
 
 
Sort_Simple::Sort_Simple(vector<int>::iterator b,vector<int>::iterator e,long size):Sort_Basic(b,e,size)
{
 
}
 
void Sort_Simple::Sort()
{
    long start = clock();
    sort(bi,ei);
    long end = clock();
    time = (end-start)*0.001;
    IsSort(bi,ei);
    cout<<endl<<"ОБЫЧНАЯ СОРТИРОВКА. Время => "<<time<<" сек"<<endl<<endl;
}
 
 
/*Sort_2thread_Basic::Sort_2thread_Basic(vector<int>::iterator b,vector<int>::iterator e,long size):Sort_Basic(b,e,size)
{
    avei = b;
    advance(avei,size/2);
}*/
 
Sort_2thread_Basic::Sort_2thread_Basic(vector<int> &vec):Sort_Basic(vec.begin(),vec.end(),vec.size()), aim(vec)
{
    avei = bi;
    advance(avei,size/2);
}
 
void Sort_2thread_Basic::half_sort()
{
    
    vector<int>::iterator p[2];
    p[0]=avei;
    p[1]=ei;
    HANDLE potok = CreateThread(NULL, 0, Sort_2thread_Basic::Potok_Sort, this, 0, NULL);
    sort(bi,avei);
    WaitForSingleObject(potok, INFINITE);
}
 
 
DWORD Sort_2thread_Basic::Potok_Sort (void* param)
{
    Sort_2thread_Basic * p = static_cast<Sort_2thread_Basic*>(param);
    sort(p->avei, p->ei);
    
 
/*vector<int>::iterator* p=static_cast<vector<int>::iterator*> (param);
    sort(p[0],p[1]);
        */
    return 0;
}
 
void Sort_2thread_Basic::Sort()
{
 
}
 
Sort_2t_1tM::Sort_2t_1tM(vector<int> &vec):Sort_2thread_Basic(vec)
{
 
}
 
void Sort_2t_1tM::Sort()
{
    long start = clock();
    half_sort();
    vector<int> helper(size);
    merge(aim.begin(),avei,avei,aim.end(),helper.begin());
    swap(aim,helper);
    long end = clock();
    time = (end-start)*0.001;
    IsSort(aim.begin(),aim.end());
    cout<<endl<<"СОРТИРОВКА 2 ПОТОКА___MERGE 1 ПОТОК. Время => "<<time<<" сек"<<endl<<endl;
}
 
 
Sort_2t_2tM::Sort_2t_2tM(vector<int> &vec):Sort_2thread_Basic(vec)
{
 
}
 
void Sort_2t_2tM::Sort()
{
    long start = clock();
    half_sort();
    HANDLE potok1 = CreateThread(NULL, 0, Sort_2t_2tM::Potok_Divide, this, 0, NULL);
    
    vector<int> helper(size);
    helper_it_begin = helper.begin();
    WaitForSingleObject(potok1,INFINITE);
 
    HANDLE potok2 = CreateThread(NULL, 0, Sort_2t_2tM::Merge_Help, this, 0, NULL);
    
    auto To = helper.begin();
    advance(To, elem_size1 + elem_size2);
    merge(IT1, avei, IT2, ei, To);
    
    WaitForSingleObject(potok2, INFINITE);
    swap(aim,helper);
 
    long end = clock();
    time = (end-start)*0.001;
    IsSort(aim.begin(),aim.end());
    cout<<endl<<"СОРТИРОВКА 2 ПОТОКА___MERGE 2 ПОТОКА. Время => "<<time<<" сек"<<endl<<endl;
}
 
DWORD Sort_2t_2tM::Potok_Divide(void *param)
{
    Sort_2t_2tM * p = static_cast<Sort_2t_2tM *>(param);
    p->IT1 = p->bi;
    p->elem_size1 = distance(p->bi, p->avei)/2;
    advance(p->IT1,p->elem_size1);
 
    auto IT1_copy = p->IT1;
    IT1_copy--; //может лучше *(IT1-1) ???
    auto find = *(IT1_copy);
 
    p->IT2 = lower_bound(p->avei, p->ei, find);
    p->elem_size2 = distance(p->avei, p->IT2);
    return 0;
}
 
DWORD Sort_2t_2tM::Merge_Help(void * param)
{
    Sort_2t_2tM * p = static_cast<Sort_2t_2tM *>(param);
    merge(p->bi, p->IT1, p->avei, p->IT2, p->helper_it_begin);
    return 0;
}
 
}
Всё работает, как часы из мейна, находящегося в этом же проекте
C++ (Qt)
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
#include "stdafx.h"
#include "Sort_Basic.h"
#include <fstream>
#include <conio.h>
 
using namespace Sort_Classes;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"rus");
    srand(time(0));
 
 
    unsigned N;
 
/*//Для записи в файл
    ofstream FILE;
    FILE.open("90000000.txt");
    N=90000000;
    FILE<<"2T1M\t1T\t2T2M"<<endl;
    for(int i=0; i<150; ++i)
{
//*/
 
//Консольная работа
    cout<<"Введите кол-во элементов (десятки миллионов)"<<endl;
    cin>>N;
    cout<<endl;
//  
try
    {
        vector<int> v1(N); //для обычного merge
        for(unsigned i=0; i<N; ++i)
            v1[i] = rand()*100000+rand();
        
        vector<int> v2(v1); //для обычного sort
        vector<int> v3(v1); //для двухпотомчного merge
 
        Sort_2t_1tM sorter1(v1);
        sorter1.Sort();
        //FILE<<(int)(sorter1.Get_Time()*1000)<<"\t";   //запись
 
 
        Sort_Simple sorter2(v2.begin(), v2.end(), v2.size());
        sorter2.Sort();
        //FILE<<(int)(sorter2.Get_Time()*1000)<<"\t";   //запись
 
        Sort_2t_2tM sorter3(v3);
        sorter3.Sort();
        //FILE<<(int)(sorter3.Get_Time()*1000)<<endl;   //запись
 
        //cout<<endl<<endl<<"Выполнено на "<<(int)(((double)i/150)*100)<<"%"<<endl<<endl; //запись
    }
 
catch(bad_alloc& ba)
    {
        cout<<"\n++++++++++++++++++++ERROR++++++++++++++++++++\n";
        cout<<"Аварийное завершение программы - не могу выделить столько памяти "<<ba.what()<<"\n";
    }
 
    getch();
//}//запись
    return 0;
}
Дальше хотел бы задавать вопросы по-порядку, а не все сразу:
Теперь пытаюсь сделать из моего неймспейса dll
Для этого поступаю так (кстати, вдруг, важно - VS 2010)
Создаю проект "библиотека классов"
копирую туда свои файлы .h и .cpp
И тут возникает вопрос - нашёл этот спецификатор "__declspec( dllexport )"
как я понял, его нужно вставлять, если я хочу, чтобы dll экспортировал мою функцию (ну и по аналогии - класс)
1.) нужно ли мне его вставлять перед именами класса? (ну или вообще куда-нибудь)

Добавлено через 9 часов 41 минуту


Добавлено через 9 часов 3 минуты
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 20:35     C++ and dll -> нужна консультация на моём примере
Посмотрите здесь:

Нужна консультация по Visual Studio 6.0 C++
C++ Подскажите,нужна консультация
Нужна консультация C++
Нужна консультация по ДМ C++
C++ нужна консультация по C++, относительно AVR
Нужна консультация C++
Нужна консультация C++
C++ Нужна консультация специалистов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 11:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru