Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ Borland] Многопоточное приложение 
:(
    Опции темы
neomax38
Дата 19.3.2012, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.12.2010

Репутация: нет
Всего: нет



Задание:
 Охранное агентство разработало новую систему управления электронными замками. Для открытия двери клиент обязан произнести произвольную фразу из 25 слов. В этой фразе должно встречаться заранее оговоренное слово, причем только один раз. Требуется создать многопоточное приложение, управляющее замком. Потоки должны осуществлять сравнение параллельно по словам.
 Из примера выдернул потоки осталось только с разбором фразы разобраться.
Вот на что ума хватило:
Код

#include <stdio.h>
#include <conio.h>
#include <windows.h>
const int n = 25;
int a[25]={123 18 456 489 }; //фраза
int slovo = 1234; //секретное слово
int colvo = 0;
int open = 0;

switch
case 1234: open = 1; colvo++;


DWORD WINAPI ThreadFunc(PVOID pvParam)//Ôóíêöèÿ ïîòîêà
{
if
a[i]==slovo{
open=1; }
}

      //    int num,sum = 0,i;
       //    num = 25*(*((int *)pvParam));
    //  for(i=num;i<num+25;i++) sum += a[i]*a[i];
    //   *(int*)pvParam = sum;
    //    DWORD dwResult = 0;
       //    return dwResult;


int main(int argc, char** argv)
{
    int x[n];
    int i,rez = 0;
    DWORD dwThreadId[n],dw;
    HANDLE hThread[n];
    for (i=0;i<n;i++) a[i] = i;
    //создание n дочерних потоков
    for (i=0;i<n;i++)
    {
        x[i] = i;
        hThread[i] = CreateThread(NULL,0,ThreadFunc,(PVOID)&x[i], 0, &dwThreadId[i]);
        if(!hThread) printf("main process: thread %d not execute!",i);
    }
    // ожидание завершения n потоков
    dw = WaitForMultipleObjects(n,hThread,TRUE,INFINITE);
    for(i=0;i<n;i++) rez+=x[i];
    printf("OPEN = %d\n",rez);
    getch();
    return 0;
}

PM MAIL   Вверх
borisbn
Дата 24.3.2012, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 11
Всего: 135



Вот вариант на C++ Borland
Код

#include <string>
#include <stdio.h>
#include <windows.h>

std::string phrase[] = {
      "a", "b", "c", "d", "e",
      "f", "g", "h", "i", "j",
      "k", "l", "m", "n", "o",
      "p", "q", "r", "s", "t",
      "u", "v", "w", "x", "y" };
const int n = sizeof( phrase ) / sizeof( phrase[ 0 ] );
std::string key = "g";
int res[ n ];

DWORD WINAPI ThreadFunc( PVOID pvParam ) {
    int i = (int)pvParam;
    res[ i ] = ( phrase[ i ] == key );
}

int main()
{
    HANDLE hThread[ n ];
    for (int i = 0; i < n; i++ ) {
         hThread[ i ] = CreateThread( NULL, 0, ThreadFunc, (PVOID)i, 0, NULL );
    }
    WaitForMultipleObjects( n, hThread, TRUE, INFINITE );
    int count = 0;
    for ( int i = 0; i < n; i++ ) {
        count += res[ i ];
    }
    if ( count == 1 ) {
         printf( "unlocked\n");
    }
    else {
         printf( "locked\n");
    }
}

Вот вариант на современном Си++
Код

#include <string>
#include <thread>
#include <iostream>

void compare( const std::string & word, const std::string & key, int & eq ) {
   eq = (word == key);
}

int main()
{
   std::string phrase[] = {
      "a", "b", "c", "d", "e",
      "f", "g", "h", "i", "j",
      "k", "l", "m", "n", "o",
      "p", "q", "r", "s", "t",
      "u", "v", "w", "x", "y" };
   const int n = sizeof( phrase ) / sizeof( phrase[ 0 ] );
   std::string key = "g";
   int res[ n ];
   std::thread* threads[ n ];
   for ( int i = 0; i < n; i++ ) {
      threads[ i ] = new std::thread( compare, phrase[ i ], key, std::ref( res[ i ] ) );
   }
   int count = 0;
   for ( int i = 0; i < n; i++ ) {
      threads[ i ]->join();
      delete threads[ i ];
      count += res[ i ];
   }
   if ( count == 1 ) {
      std::cout << "unlocked" << std::endl;
   }
   else {
      std::cout << "locked" << std::endl;
   }
}

http://liveworkspace.org/code/6d093b8f9902...bc0c55adffaf5d7

А вам, батенька, стоит начинать не с потоков, а с синтаксиса языка, с построением алгоритмов и т.п. 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
neomax38
Дата 25.3.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 15.12.2010

Репутация: нет
Всего: нет



Цитата(borisbn @ 24.3.2012,  15:02)
Вот вариант на C++ Borland
Код

#include <string>
#include <stdio.h>
#include <windows.h>

std::string phrase[] = {
      "a", "b", "c", "d", "e",
      "f", "g", "h", "i", "j",
      "k", "l", "m", "n", "o",
      "p", "q", "r", "s", "t",
      "u", "v", "w", "x", "y" };
const int n = sizeof( phrase ) / sizeof( phrase[ 0 ] );
std::string key = "g";
int res[ n ];

DWORD WINAPI ThreadFunc( PVOID pvParam ) {
    int i = (int)pvParam;
    res[ i ] = ( phrase[ i ] == key );
}

int main()
{
    HANDLE hThread[ n ];
    for (int i = 0; i < n; i++ ) {
         hThread[ i ] = CreateThread( NULL, 0, ThreadFunc, (PVOID)i, 0, NULL );
    }
    WaitForMultipleObjects( n, hThread, TRUE, INFINITE );
    int count = 0;
    for ( int i = 0; i < n; i++ ) {
        count += res[ i ];
    }
    if ( count == 1 ) {
         printf( "unlocked\n");
    }
    else {
         printf( "locked\n");
    }
}

Вот вариант на современном Си++
Код

#include <string>
#include <thread>
#include <iostream>

void compare( const std::string & word, const std::string & key, int & eq ) {
   eq = (word == key);
}

int main()
{
   std::string phrase[] = {
      "a", "b", "c", "d", "e",
      "f", "g", "h", "i", "j",
      "k", "l", "m", "n", "o",
      "p", "q", "r", "s", "t",
      "u", "v", "w", "x", "y" };
   const int n = sizeof( phrase ) / sizeof( phrase[ 0 ] );
   std::string key = "g";
   int res[ n ];
   std::thread* threads[ n ];
   for ( int i = 0; i < n; i++ ) {
      threads[ i ] = new std::thread( compare, phrase[ i ], key, std::ref( res[ i ] ) );
   }
   int count = 0;
   for ( int i = 0; i < n; i++ ) {
      threads[ i ]->join();
      delete threads[ i ];
      count += res[ i ];
   }
   if ( count == 1 ) {
      std::cout << "unlocked" << std::endl;
   }
   else {
      std::cout << "locked" << std::endl;
   }
}

http://liveworkspace.org/code/6d093b8f9902...bc0c55adffaf5d7

А вам, батенька, стоит начинать не с потоков, а с синтаксиса языка, с построением алгоритмов и т.п.

Я бы с радостью) Только вот мы с этого начали работы на С ) И препод не стал объяснять в подробностях)  Спасибо за помощь!)

Это сообщение отредактировал(а) neomax38 - 25.3.2012, 14:43
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0447 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.