Уничтожьте заблокированное Повышение:: Поток

Как я могу получить путь к файлу из этого типа URI контента?

У вас нет, так как нет никакого файла вообще за Uri, не говоря уже о том, к которому вы можете получить доступ. Это Uri может указывать на:

  • Локальный файл на внешнем хранилище
  • Локальный файл на внутренней памяти для другого приложения
  • Локальный файл на съемном носителе
  • Локальный файл, который зашифрован и должен быть дешифрован на лету
  • Поток байтов, хранящихся в столбце BLOB в базе данных
  • Часть содержимого, которое должно быть загружено другим приложением первым
  • ... и т. д.

Все другие приложения, такие как Facebook, Google+ это делает

Нет, это не так. Они используют ContentResolver и:

  • openInputStream() для чтения в байтах, связанных с содержимым
  • getType(), чтобы получить тип MIME, связанный с содержимым
  • query() и OpenableColumns, чтобы получить размер и отображаемое имя, связанные с контентом
20
задан Piotr Dobrogost 11 July 2009 в 19:38
поделиться

5 ответов

Я не думаю, что существует способ сделать это кросс-платформенный, но pthread_cancel должен быть тем, что Вы ищете. С потоком повышения можно добраться native_handle от потока и назвать pthread_cancel на нем.

, Кроме того, лучший путь мог бы состоять в том, чтобы использовать повышение asio, эквивалентный из избранного запроса к нескольким файлам. Тем путем один поток будет заблокирован, ожидая входа, но он мог прибыть из любого входного потока. Я не знаю, как легкий это должно сделать что-то вроде этого с iostreams все же.

4
ответ дан 30 November 2019 в 01:24
поделиться

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

В boost:thread Вы ищете функция timed_join.

, Если бы Вы хотите посмотреть на корректный ответ, однако, который должен был бы использовать неблокирование io с синхронизированным, ожидает. Разрешение Вам получить структуру потока синхронного io, с неблокированием асинхронного io.

Вы говорите о чтении формы istream, но istream является только интерфейсом. для stdin Вы можете просто fclose stdin дескриптор файла для прерывания чтения. Что касается другого, это зависит, где Вы читаете из...

0
ответ дан 30 November 2019 в 01:24
поделиться

В соответствии с Windows, используйте QueueUserAPC для организации очередей proc, который выдает исключение. Тот подход хорошо работает для меня.

ОДНАКО : я только что нашел, что взаимные исключения повышения и т.д. не "alertable" на win32, таким образом, QueueUserAPC не может прервать их.

0
ответ дан 30 November 2019 в 01:24
поделиться

Хорошо на linux , Я использую pthread_signal (SIGUSR1), так как он прерывает блокирующий ввод-вывод. В окнах нет такого вызова, как я обнаружил при переносе кода. Только устаревший в вызове чтения сокета. В окнах вы должны явно определить событие, которое прервет ваш блокирующий вызов. Таким образом, не существует такой вещи (AFAIK), как общий способ прерывания блокирующего ввода-вывода.

Дизайн boost.thread справляется с этим, управляя четко идентифицированными точками прерывания. Я плохо знаю boost.asio и, похоже, вы все равно не хотите на него полагаться. Если вы не хотите проводить рефакторинг для использования неблокирующей парадигмы, вы можете использовать что-то среднее между неблокирующим (опросом) и блокирующим вводом-выводом. То есть сделать что-то вроде (псевдокод?):

while(!stopped && !interrupted)
{
    io.blockingCall(timeout);
    if(!stopped && !interrupted)
    {
        doSomething();
    }
}

Затем вы прерываете два ваших потока и соединяете их ...

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

Изменить: Кстати, меня интересует окончательное решение, которое у вас есть ...

1
ответ дан 30 November 2019 в 01:24
поделиться

Кажется, что потоки не помогают вам делать то, что вы хотите простым способом. Если Boost. Asio вам не нравится, рассмотрите возможность использования select () .

Идея состоит в том, чтобы получить два файловых дескриптора и использовать select () , чтобы сообщить вам, какой из них имеет доступный ввод . Файловый дескриптор для cin обычно STDIN_FILENO ; как получить другой зависит от ваших особенностей (если это файл, просто open () it вместо использования ifstream ).

Вызов select () в цикле, чтобы узнать, какой ввод читать, и когда вы хотите остановиться, просто выйдите из цикла.

0
ответ дан 30 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

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