Одновременно писать и читать файл из NDK в android

Я пишу в файл, используя android-ndk. Таким образом, запись в файл происходит с использованием собственного кода C.

Он содержит какие-то показания, которые я ввожу с помощью ndk. По нажатию кнопки начинается запись в файл. И одновременно я хочу прочитать содержимое файла и использовать его в другом потоке для отображения значений, поскольку операция записи может продолжаться в течение 15 секунд, и пользователю придется ждать столько времени, чтобы увидеть результат, поэтому я хочу показать результат один один, как только я получу его в этот файл.

Возможно ли это, если да, можете показать мне, как это сделать?

Ну, я начал с этого, и прямо сейчас, как я это делаю,

Thread thr1 = new Thread(r1);
Thread thr2 = new Thread(r2);
thr1.start();
thr2.start();



r1 = new Runnable() {
          public void run() {
            File sdcard= Environment.getExternalStorageDirectory();
            nativeFunction(sdcard +"/readings.txt");
            //takingReading=false;
            readingFile = new File(sdcard +"/readings.txt");

            Log.i("length of file", ""+readingFile.length());
          }
        };




r2 = new Runnable() {
          public void run() {
            try {

                  Thread.sleep(3000);
                  File sdcard= Environment.getExternalStorageDirectory();

                readingFile = new File(sdcard +"/readings.txt");

                Log.i("length of file", ""+readingFile.length());


            } catch (InterruptedException iex) {}
          }
        };

Родная функция открывается

file= fopen(location,"w+");

Эта функция продолжает записывать данные в файл около 2 минут, но мне нужно постоянно получать значения, введенные собственной функцией, поэтому я начал второй поток, но когда я проверяю file.length(), он всегда равен 0.

и когда запись встроенной функции завершена, приходит фактический размер файла. Так как же обойти эту проблему?


person Amit Hooda    schedule 12.10.2012    source источник
comment
я хотел знать осуществимость, возможно это или нет, тогда только я думал о том, чтобы начать это.   -  person Amit Hooda    schedule 12.10.2012


Ответы (1)


Это должно быть возможно с помощью pthreads. Таким образом, вам нужно создать 2 потока, один для записи, а другой для чтения. Если вы делаете это из одного и того же файла, вы можете столкнуться с условиями гонки, поэтому будьте осторожны.

Больше информации о pthreads, пожалуйста, погуглите. Он обычно используется в мире Linux.

person Royston Pinto    schedule 12.10.2012
comment
спасибо за то, что дал толчок к этому, большое спасибо - person Amit Hooda; 12.10.2012
comment
Вы можете создать поток чтения из Java и вызвать из него NDK. Это ненамного легче. - person Seva Alekseyev; 12.10.2012
comment
я добавил больше деталей и где я застрял, - person Amit Hooda; 15.10.2012
comment
Вероятно, смешивание потоков Java с NDK может быть не очень хорошей идеей. Почему бы вам не реализовать оба с помощью NDK? - person Royston Pinto; 16.10.2012
comment
строка, которую я храню, имеет вид 23,34,45,32,12,45 и т. д., это работа, которую выполняет NDK. Теперь я хочу прочитать эти значения и соответствующим образом изменить значения в тексте редактирования, который присутствует в Java. - person Amit Hooda; 16.10.2012
comment
вы пытаетесь прочитать файл, в то время как он одновременно пишется?? Если это так, то это состояние гонки, не так ли? в таких случаях результаты могут быть непредсказуемыми... чтение из отдельного файла и запись в отдельный файл. - person Royston Pinto; 16.10.2012
comment
как это может быть достигнуто здесь? Означает, что если я запишу в другой файл, что файл, который мне нужно прочитать, чтение другого файла не обеспечит решение проблемы, которая у меня есть? - person Amit Hooda; 17.10.2012
comment
Амит, сама концепция проблемы чтения и записи состоит в том, чтобы предотвратить одновременное чтение/запись в один и тот же файл. Потому что это даст вам непредсказуемые результаты. Многие вещи, такие как проблемы со временем, чтение после записи, запись после чтения, возникнут, и их невозможно решить. Архитектура была реконструирована, чтобы решить эту проблему. Итак, вы захотите написать, а затем прочитать свой файл отдельно, если это один файл. - person Royston Pinto; 17.10.2012