воскресенье, 28 ноября 2010 г.

Функция с переменным количеством параметров

Hi!Для операционных систем для реализации синхронизации разных запросов,используется разные фишки: мьютексы,семафоры,событи и т.д. Я выбрал события,и для разных функций использовалось переменное количество переменных для синхронизации секций.И решать проблему не хочется Ctrl+c, Ctrl+v)Решил написать функцию с переменным количеством параметров:)

HANDLE * hmains(HANDLE handle,...)
{
va_list par; //лист с параметрами*
int count = -1; // количество переменных
int size; // вспомогательная переменная
HANDLE *cp = &handle; // Начало в памяти для всех переменных функции
va_start(par,handle); // присваиваем листу начало для переменных
while(cp = va_arg(par,HANDLE*)) // подсчёт количество переменных
count++;
size = count;
va_start(par,handle);
HANDLE *hmain = new HANDLE[count]; // Память под массив переменных
hmain[0] = handle; // Первая переменная в массиве
while(cp = va_arg(par,HANDLE *)) // Заполняем массив оставшимися переменными
{
if(size==1)
break;
hmain[count - size +1] = cp; // непосредственно заполнение
size--;
}
return hmain; // Возвращаем массив переменных
}

Конечно можно придраться к реализации или с умничать по каждой строчке,но статья для возможности показать вариант реализации,а уж каждый сможет его как хочет изменять и модифицировать)

суббота, 13 ноября 2010 г.

Использование потоковых функций в классе

Итак я столкнулся с 1 проблемой,что у меня был класс Server,который работал всего с 1 клиентом.Но это не нормально когда сервер всего для 1 клиента,поэтому пришлось сделать потоковую функция для обработки запросов клиентов:)А т.к при вызове функции CreateThread протокол у функции должен быть иным,чем у функции класса,происходил FAIL.Пришлось выкручиваться.
Покажу реализацию на простом примере.
Простой класс.

class Data;
struct dataStruct
{
Data *data;
HANDLE handle;
};
class Data
{
public:
Data()
:xData(10),
yData(10)
{

}
~Data()
{

}
int & x(){return this->xData;}
int & y(){return this->yData;}
int sum()const{return xData+yData;}
/*Запиливаем потоковую функцию*/
friend DWORD WINAPI thread(void *param)
{
dataStruct *data = (dataStruct*)param;
int count = data->data->sum();
for(int i=0;i< count ; i++)
{
Sleep(100);
cout << data->data->sum() << endl;
data->data->x()++;
data->data->y()++;
}
return 0;
}
private:
int xData;
int yData;
};

А теперь просто в main будем запускать.

void main()
{
for(int i = 0; i<10; i++)
{
Data data;
dataStruct rec;
rec.data = &data;
Sleep(1000);
rec.handle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread,(LPVOID)&rec ,0,0);
}
Sleep(10000);
}

вторник, 2 ноября 2010 г.

Qt + MySQL

Начали проходить БД, и дело, конечно, не обошлось без MySQL:) Так как я любитель Qt, То GUI конечно хотелось бы написать на нём и соответственно взаимодействие с БД осуществить с помощью этой библиотеки.
Все, я думаю, читали, что для использования возможностей API MySQL надо просто подключить нужный драйвер, в нашем случае это QMYSQL. Делается это очень просто.
QSqlDatabase  & db = QSqlDatabase::addDatabase("QMYSQL","base");

Но при запуске может возникнуть проблема - библиотека говорит нам, что драйвер QMYSQL не найден. А ведь действительно, откуда qt знает, где наш sql  Как говорится – «телепаты в отпуске» :)
Что же нам делать в этом случае? Ответ вполне прост, надо нам собрать qt с нужными для нас модулями, в частности для mysql. Делать мы это будем в любимой всеми командной строке.
Так как я не любитель стандартной консоли в windows, то пользуюсь программой “Console”. Название вполне оригинальное:)
Итак, что там нужно: во-первых, собираться будем для visual studio 2008, поэтому будем пользоваться её утилитой Visual Studio 2008 Command Prompt.
Или можно ввести в консоли следующее:
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86



p.s путь к батнику у вас может быть иным .
Итак, теперь осталось верно собрать кутишечку:)
Для этого переходим в консоли в папку с Qt и набираем:
configure –debug-and-release –platform win32-msvc2008 –qt-sql-mysql



Дальше пойдёт сборка



После окончания сборки, мы радостные по идее должны зайти в src\sql и выполнить nmake, но не тут-то было:) Нам скажут , что он не понимает где лежат сами либы. Придётся прикручивать всё вручную, ну как обычно:)
Находим либы и инклуды в папке с MySQL. По идее, они должны лежать в MySQL\MySQL Server\lib .
Так вот, смысл в том, что мы вручную указываем в исходниках qt путь до этой папки с файлом mysql.h.
В моём случае получилось так :



Теперь снова заходим в src\sql и делаем nmake



Теперь всё должно пройти нормально:)
Удачи. Если что пишите на почту chexov34@gmail.com по возможности отвечу.
Отдельное спасибо Мамонтову Дмитрию http://vkontakte.ru/id6925882. Он просто мегамозг и задрот :)