Предотвратить перевод сообщений об исключениях на язык пользователя?

#include <thread>
#include <iostream>

class bar {
public:
  void foo() {
    std::cout << "hello from member function" << std::endl;
  }
};

int main()
{
  std::thread t(&bar::foo, bar());
  t.join();
}

EDIT: Учет вашего редактирования, вы должны сделать это следующим образом:

  std::thread spawn() {
    return std::thread(&blub::test, this);
  }

UPDATE: я хочу объяснить несколько пунктов, некоторые из них также обсуждались в комментариях.

Синтаксис, описанный выше, определен в терминах определения INVOKE (§20.8.2.1):

Определить INVOKE (f, t1, t2,. .., tN) следующим образом:

  • (t1. * f) (t2, ..., tN), когда f является указателем на функцию-член класса T и t1 является объект типа T или ссылку на объект типа T или ссылку на объект типа, полученного из T;
  • ((* t1). * f) (t2, ..., tN ), когда f является указателем на функцию-член класса T и t1 не является одним из типов, описанных в предыдущем пункте;
  • t1. * f, когда N == 1 и f является указателем на данные члена класса T и t 1 являются объектами типа T или ссылкой на объект типа T или ссылкой на объект типа, полученного из T;
  • (* t1). * f, когда N == 1 и f является указателем на данные элемента класса T и t 1 не является один из типов, описанных в предыдущем пункте:
  • f (t1, t2, ..., tN) во всех других случаях.

Еще один общий факт, который я хочу отметить, заключается в том, что по умолчанию конструктор потока копирует все переданные ему аргументы. Причина этого в том, что аргументам может потребоваться пережить вызывающий поток, и копирование аргументов гарантирует это. Вместо этого, если вы хотите действительно передать ссылку, вы можете использовать std::reference_wrapper, созданный std::ref.

std::thread (foo, std::ref(arg1));

Поступая таким образом, вы обещаете, что будете заботиться о том, чтобы аргументы будут существовать, когда поток работает на них.


Обратите внимание, что все перечисленные выше могут также применяться к std::async и std::bind.

30
задан aku 13 October 2008 в 12:20
поделиться

5 ответов

Можно попробовать установку Thread.CurrentThread.CurrentUICulture и/или .CurrentCulture к CultureInfo("en-US").

9
ответ дан Alexander Kojevnikov 13 October 2008 в 12:20
поделиться
  • 1
    Не " мой preference" в таких ситуациях. Мне нравится тернарный оператор за установку по умолчанию / установка переменных. Но, учитывая, что то, что Вы спросили, существует то, как Вы делаете это:) – Brad F Jacobs 17 August 2010 в 21:28

Если это - приложение ASP.NET, можно установить язык UI в web.config (*):

<system.web>
    <globalization ... uiCulture="en-US" ... />
</system.web>

Для других приложений, региональные настройки текущего пользователя используются по умолчанию, и необходимо явно переопределить его - например, Поток. CurrentUICulture = новый CultureInfo ("en-США").

(*) протест - если ошибка в результатах файла конфигурации в исключении, выданном, прежде чем, элемент обрабатывается, Вы получите значение по умолчанию uiCulture.

2
ответ дан Joe 13 October 2008 в 12:20
поделиться
  • 1
    Да легко пропущенная ошибка с моей стороны. Зафиксированный это Гамбо. – Brad F Jacobs 18 August 2010 в 13:09

То, чтобы вынуждать исключения отобразиться на различном языке кажется немного резким на пользователе..., можно ли отобразить код ошибки наряду с сообщением? Тогда пользователь получит что-то, что они могут понять, и можно искать код ошибки для переведенной версии.

я не .net парень, таким образом, я не знаю, возможно ли это, просто идея.

2
ответ дан MrZebra 13 October 2008 в 12:20
поделиться

, Как я подаю свою заявку всегда, используют английский язык при отображении win32/.net сообщений исключений?

, В первую очередь, не показывают win32/.net сообщения об исключениях пользователям . Необходимо обработать исключения вместо того, чтобы показать их пользователю.

сообщениями об исключениях по умолчанию будет показан на языке UI тока (если соответствующий пакет языка будет установлен, иначе они нейтрализация английскому языку). Можно изменить сообщения об исключениях, изменяющиеся Поток. CurrentThread. Свойство CurrentUICulture, однако это будет влиять на целый GUI Вашего приложения.

0
ответ дан aku 13 October 2008 в 12:20
поделиться
  • 1
    Как @Gumbo указанный, это - всего один тернарный оператор, не " the". " Другое распространенное слово является условным оператором " – strager 18 August 2010 в 13:10

Весь больше причины, почему исключения не должны быть переведены (плохо). При входе исключений это делает muc большим количеством смысла сделать это на единственном языке. Я не могу полагать, что Microsoft не думала о способе сделать это кроме UICulture, который является в основном неопцией: (

4
ответ дан 13 October 2008 в 12:20
поделиться
  • 1
    It’s тернарный оператор, но не тернарный оператор (хотя я don’t знаю любой другой тернарный оператор). Другое распространенное слово является условным оператором. – Gumbo 18 August 2010 в 06:05
Другие вопросы по тегам:

Похожие вопросы: