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

Статический метод как точка входа в поток - как избавиться - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Поиск слова которое встречается чаще всех http://www.cyberforum.ru/cpp-beginners/thread1065307.html
Есть строка определить какое слово встречается в строке чаще всего и вывести его. Помогите пожалуйста очень надо. Заранее благодарен.
C++ Максимальное из чисел, встречающихся в матрице болеее одного раза serial_max=0; serial=1; digit=0; digit_max=0; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { if (a==a) {serial++; digit=a;} else serial=1; if (serial_max<serial) {serial_max=serial; serial=0;digit_max=digit;} } } http://www.cyberforum.ru/cpp-beginners/thread1065304.html
Вычислить x C++
помогите решить пример пожалуйста)самым простым способом срочно надо!зарание спасибо вот задание
Максимальный элемент динамического двумерного массива C++
Напишите пожалуйста программу которая находила бы максимальный элемент динамического двумерного массива
C++ boost regex_match - Баг? http://www.cyberforum.ru/cpp-beginners/thread1065282.html
Снова неразрешимая проблема ( По документации, функции поиска regex_match/regex_search должны заполнять (делать не пустым) объект с результатами поиска, только если находят все/часть регулярного выражения в строке. В этом коде ну никак не может совпадать ни часть, ни все регулярное выражение. Но объект what на выходе НЕ пустой. #include <boost/regex.hpp> #include <iostream> int main() ...
C++ выдает ошибку на втором файле , подскажите по сути программа должна в 1 и 2 файле найти одинаковые слова и записать в 3 . #include "stdafx.h" #include "iostream" #include "algorithm" #include "string" #include "iterator" #include "fstream" #include "set" using namespace std; подробнее

Показать сообщение отдельно
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.01.2014, 12:48     Статический метод как точка входа в поток - как избавиться
похоже что новый стандарт вам доступен и вы сможете вот такой пример скомпилять:
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
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
#include <functional>
#include <memory>
#include <string>
#include <iostream>
 
//////////////////////////////////////////////////////
// аналог апишной функции. считаем что она запускает
// переданную функцию в отдельном потоке
typedef void (ThreadFuncPtr)(void*);
void RunThread(ThreadFuncPtr threadFunc, void* param)
{
  threadFunc(param);
}
//////////////////////////////////////////////////////
 
// наш класс помошник
class RunThreadHelper
{
  // если новый стандарт недоступен, то
  // этой штуке есть альтернатива:
  // абстрактный класс с одной функцией.
  // но std::function - удобнее.
  typedef std::function<void ()> Operation;
 
public:
  static void Run(Operation operation)
  {
    // когда и как освобождать этот op - придумайте сами.
    // в простейшем случае - в ThreadFunction если все пошло хорошо.
    Operation* op = new Operation(std::move(operation));
    RunThread(&RunThreadHelper::ThreadFunction, op);
  }
 
private:
  static void ThreadFunction(void* param)
  {
    std::unique_ptr<Operation> op(static_cast<Operation*>(param));
    (*op)();
  };
};
 
 
void FreeFunction1()
{
  std::cout << "FreeFunction1" << std::endl;
}
 
void FreeFunction2(int param)
{
  std::cout << "FreeFunction2: param = " << param << std::endl;
}
 
void FreeFunction3(int param1, const std::string& param2)
{
  std::cout << "FreeFunction3: param1 = " << param1 << "; param2 = " << param2 << std::endl;
}
 
class Test
{
  std::string m_name;
 
public:
  Test(const std::string& name)
    : m_name(name)
  {
  }
 
  void Function1()
  {
    std::cout << "Test::Function1: m_name = " << m_name << std::endl;
  }
 
  void Function2(int param)
  {
    std::cout << "Test::Function2: m_name = " << m_name << "; param = " << param << std::endl;
  }
 
  void Function3(int param1, const std::string& param2)
  {
    std::cout << "Test::Function3: m_name = " << m_name << "; param1 = " << param1 << "; param2 = " << param2 << std::endl;
  }
};
 
 
int main()
{
  Test test1("test1");
  Test test2("test1");
 
  RunThreadHelper::Run(&FreeFunction1);
 
  RunThreadHelper::Run(std::bind(&FreeFunction2, 2));
  RunThreadHelper::Run([] { FreeFunction2(22); });
  RunThreadHelper::Run(std::bind(&Test::Function1, &test1));
  RunThreadHelper::Run(std::bind(&Test::Function2, &test1, 2));
  RunThreadHelper::Run(std::bind(&Test::Function3, &test1, 2, "x"));
 
  RunThreadHelper::Run(std::bind(&FreeFunction3, 3, "x"));
  RunThreadHelper::Run([] { FreeFunction3(33, "xx"); });
  RunThreadHelper::Run([&test2] { test2.Function1(); });
  RunThreadHelper::Run([&test2] { test2.Function2(2); });
  RunThreadHelper::Run([&test2] { test2.Function3(22, "xx"); });
 
  return 0;
}
Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
  static void ThreadFunction(void* param)
  {
    std::unique_ptr<Operation> op(static_cast<Operation*>(param));
    (*op)();
    // до сюда можем не дойти из-за исключения. нужно придумать как его не потерять
    // и донести до вызывающей стороны. какой-нибудь будущий результат из std использовать
    // или еще как-то.
  };
Добавлено через 10 часов 47 минут
на счет станартной библиотеки:
у std::thread есть такие методы:

std::thread::get_id - returns the id of the thread
std::thread::native_handle - returns the underlying implementation-defined thread handle

я сам не пробовал, но похоже на то, что то, что они возвращают можно использовать
в винапишных функциях после соответствующего каста. Т.е. можно зарезьюмить и засаспендить
интересующий поток.
 
Текущее время: 13:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru