Как я могу получить путь к файлу из этого типа URI контента?
blockquote>У вас нет, так как нет никакого файла вообще за
Uri
, не говоря уже о том, к которому вы можете получить доступ. ЭтоUri
может указывать на:
- Локальный файл на внешнем хранилище
- Локальный файл на внутренней памяти для другого приложения
- Локальный файл на съемном носителе
- Локальный файл, который зашифрован и должен быть дешифрован на лету
- Поток байтов, хранящихся в столбце
BLOB
в базе данных- Часть содержимого, которое должно быть загружено другим приложением первым
- ... и т. д.
Все другие приложения, такие как Facebook, Google+ это делает
blockquote>Нет, это не так. Они используют
ContentResolver
и:
openInputStream()
для чтения в байтах, связанных с содержимымgetType()
, чтобы получить тип MIME, связанный с содержимымquery()
иOpenableColumns
, чтобы получить размер и отображаемое имя, связанные с контентом
Я не думаю, что существует способ сделать это кросс-платформенный, но pthread_cancel должен быть тем, что Вы ищете. С потоком повышения можно добраться native_handle от потока и назвать pthread_cancel на нем.
, Кроме того, лучший путь мог бы состоять в том, чтобы использовать повышение asio, эквивалентный из избранного запроса к нескольким файлам. Тем путем один поток будет заблокирован, ожидая входа, но он мог прибыть из любого входного потока. Я не знаю, как легкий это должно сделать что-то вроде этого с iostreams все же.
Вместо того, чтобы пытаться уничтожить Ваш поток, Вы всегда можете tryjoin поток вместо этого, и если он перестал работать, Вы присоединяетесь к другому вместо этого. (Принятие Вас будет всегда мочь присоединиться к по крайней мере одному из Ваших двух потоков).
В boost:thread Вы ищете функция timed_join.
, Если бы Вы хотите посмотреть на корректный ответ, однако, который должен был бы использовать неблокирование io с синхронизированным, ожидает. Разрешение Вам получить структуру потока синхронного io, с неблокированием асинхронного io.
Вы говорите о чтении формы istream, но istream является только интерфейсом. для stdin Вы можете просто fclose stdin дескриптор файла для прерывания чтения. Что касается другого, это зависит, где Вы читаете из...
В соответствии с Windows, используйте QueueUserAPC для организации очередей proc, который выдает исключение. Тот подход хорошо работает для меня.
ОДНАКО : я только что нашел, что взаимные исключения повышения и т.д. не "alertable" на win32, таким образом, QueueUserAPC не может прервать их.
Хорошо на linux , Я использую pthread_signal (SIGUSR1), так как он прерывает блокирующий ввод-вывод. В окнах нет такого вызова, как я обнаружил при переносе кода. Только устаревший в вызове чтения сокета. В окнах вы должны явно определить событие, которое прервет ваш блокирующий вызов. Таким образом, не существует такой вещи (AFAIK), как общий способ прерывания блокирующего ввода-вывода.
Дизайн boost.thread справляется с этим, управляя четко идентифицированными точками прерывания. Я плохо знаю boost.asio и, похоже, вы все равно не хотите на него полагаться. Если вы не хотите проводить рефакторинг для использования неблокирующей парадигмы, вы можете использовать что-то среднее между неблокирующим (опросом) и блокирующим вводом-выводом. То есть сделать что-то вроде (псевдокод?):
while(!stopped && !interrupted)
{
io.blockingCall(timeout);
if(!stopped && !interrupted)
{
doSomething();
}
}
Затем вы прерываете два ваших потока и соединяете их ...
Может быть, в вашем случае это проще? Если у вас есть главный поток, который знает, что один поток завершен, вам просто нужно закрыть ввод-вывод другого потока?
Изменить: Кстати, меня интересует окончательное решение, которое у вас есть ...
Кажется, что потоки не помогают вам делать то, что вы хотите простым способом. Если Boost. Asio вам не нравится, рассмотрите возможность использования select ()
.
Идея состоит в том, чтобы получить два файловых дескриптора и использовать select ()
, чтобы сообщить вам, какой из них имеет доступный ввод . Файловый дескриптор для cin
обычно STDIN_FILENO
; как получить другой зависит от ваших особенностей (если это файл, просто open ()
it вместо использования ifstream
).
Вызов select ()
в цикле, чтобы узнать, какой ввод читать, и когда вы хотите остановиться, просто выйдите из цикла.