小编s3r*_*ius的帖子

这个java类线程安全吗?

这不是我的功课,这是给大学学生的一项任务.出于个人兴趣,我对解决方案感兴趣.

任务是创建一个包含整数的类(Calc).这两个方法add和mul应该添加或乘以这个整数.

同时设置两个线程.一个线程应该调用c.add(3)十次,另一个应该调用c.mul(3)十次(当然在同一个Calc对象上).

Calc类应确保操作交替完成(add,mul,add,mul,add,mul,..).

我没有经常处理与并发相关的问题 - 更不用说Java了.我已经为Calc提出了以下实现:

class Calc{

    private int sum = 0;
    //Is volatile actually needed? Or is bool atomic by default? Or it's read operation, at least.
    private volatile bool b = true;

    public void add(int i){
        while(!b){}
        synchronized(this){
                sum += i;
            b = true;   
        }
    }

    public void mul(int i){
        while(b){}
        synchronized(this){
            sum *= i;
            b = false;  
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我想知道我是否走在正确的轨道上.对于while(b)部分来说,肯定有一种更优雅的方式.我想听听你们这些人的想法.

PS:不得更改方法的签名.除此之外,我不受限制.

java concurrency multithreading synchronized

10
推荐指数
4
解决办法
788
查看次数

如何处理不同viewModel之间的通信?

我有一个包含许多片段的活动。每个片段都有一个其生命周期范围内的视图模型,其中包含一些逻辑。宿主活动也有一个 viewModel,包括一些显示弹出式消息的代码。

我希望我的片段视图模型能够向此弹出窗口发布消息。但是,我如何从我的片段视图模型之一访问活动视图模型?

我将编写一些示例性的 Kotlin 代码,但问题并不是 Kotlin 特有的,因为它更多的是一个架构问题。

class MyActivityViewModel {
    ...
    popupMessage = MutableLiveData<String>("") // is observed by my activity
    fun postMessage(text: String) {
        popupMessage.value = text
    }
}

class MyFragmentAViewModel {
    ...
    fun someFunctionA() {
        // want to call ActivityViewModel's postMessage from here
    }
}
class MyFragmentBViewModel {
    ...
    fun someFunctionB() {
        // want to call ActivityViewModel's postMessage from here too
    }
}

Run Code Online (Sandbox Code Playgroud)

我无法轻松调用,ViewModelProvider因为我不想在视图模型中保留对 Activity 的引用。我看到的唯一直接选项是通过构造函数或方法将 Activity-viewModel 传递给fragment-viewModel init()。这应该是安全的,因为父 viewModel 的生命周期应该超过片段 viewModel 的生命周期。我认为。 …

java android kotlin android-viewmodel

6
推荐指数
1
解决办法
2659
查看次数

在OpenGL中实例绘制动态模型

我目前正在开发一个框架,允许我方便地渲染大量的动画模型.

模型被组织为一个简单的骨骼层次结构,根部是躯干/骨盆,通常:

我简单的建模层次结构

所以,作为伪代码,我目前正在渲染这样的模型:

RenderBone(Bone b, Mat4x4 currentTransform){
    Mat4x4 pos = currentTransform * b.boneTransform;
    SetUniform("transformation", pos);
    Draw(bone.mesh);
    for each Bone bc in b.children do{
         RenderBone(bc, pos);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,对于使用具有n个骨骼的模型的单个actor,我需要n SetUniform(不计算设置纹理之类的东西)和n绘制调用.

试图减少开销,并使所有actor一次使用相同的模型,我想到切换到实例化渲染.

但是,我能找到的所有信息和教程都是关于绘制立方体,球体或类似的简单对象.无处可以看到一些关于如何使用实例化绘制来渲染模型的简单易懂的信息,其中每个部分(骨骼)需要将不同的变换矩阵赋予着色器.

所以,问题是:使用glVertexAttribDivisorgl_InstanceID我只能指定与实例相关的矩阵,而不是骨骼矩阵.那我如何应用我的骨骼转换呢?

我能想到的唯一可行的解​​决方案是 - 我可以实例化每个骨骼,而不是实例化整个模型.因此,绘制一个骨骼类型的所有实例,然后绘制另一个骨骼类型,等等.但是,我仍然需要相对经常使用转换矩阵更新缓冲区,并且它是更多的内务代码.

那么这是最好的选择吗?或者,更一般地说,是否有更好的不太复杂的渲染方式?或者,实例化渲染在与静态几何体一起使用时才真正发光?

c++ opengl opengl-3

5
推荐指数
1
解决办法
2785
查看次数

将 QFileSystemModel 与 ListView 一起使用

我正在尝试创建一个简单的ListView,我可以用来浏览文件系统,使用QFileSystem.

首先,我尝试使用我发现适用于 QDirModel 的代码:

主.qml:

    ListView {
        id: list
        width: 300
        height: 500

        model: DelegateModel {
            model: myFileModel

            delegate: Text{
                id: txt
                text: fileName

                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        //Switch directory when clicked
                        list.model.rootIndex = list.model.modelIndex(index);
                    }

                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

主.cpp:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;


    QFileSystemModel qdm;
    qdm.setFilter( QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files );

    qdm.setRootPath("/");
    engine.rootContext()->setContextProperty("myFileModel", &qdm);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

但是,ListView每次QFileSystemModel加载文件系统的另一个部分时,此代码都会重置。此处的视频- …

c++ qt qfilesystemmodel qml qt5

5
推荐指数
0
解决办法
1488
查看次数

在Winforms中显示动画gif而不锁定文件

我正在尝试在Winforms应用程序中显示各种文件类型的图像(包括动画.gif文件).我还必须能够修改显示的文件.(更改文件名,删除它们).

问题是Picturebox锁定图像文件,直到应用程序关闭时使用正常方式.

这意味着我不能这样做:

private void Form1_Load(object sender, EventArgs e)
    {

        PictureBox pic = new PictureBox();
        pic.Size = new Size(250, 250);
        pic.Image = Image.FromFile("someImage.gif");
        this.Controls.Add(pic);

                    //No use to call pic.Image = null or .Dispose of it
        File.Delete("someImage.gif"); //throws exception
    }
Run Code Online (Sandbox Code Playgroud)

上面链接中的解决方法如下:

    private void Form1_Load2(object sender, EventArgs e)
    {
        PictureBox pic = new PictureBox();
        pic.Size = new Size(250, 250);
                    //using a FileStream
        var fs = new System.IO.FileStream("someImage.gif", System.IO.FileMode.Open, System.IO.FileAccess.Read);
        pic.Image = System.Drawing.Image.FromStream(fs);
        fs.Close();

        this.Controls.Add(pic);

        pic.MouseClick += …
Run Code Online (Sandbox Code Playgroud)

.net c# window visual-studio-2010 winforms

4
推荐指数
1
解决办法
3264
查看次数

二维数组.第一个索引错误,其他所有错误

我有一个奇怪的问题,我不知道如何处理它.

我正在读取一个50x50的字符文本文件,并希望将其写入50x51动态数组(用'\ 0'填充第51个插槽).

然后我将整个阵列打印到控制台上.它应该显示50行,每行50个字符,因为这是输入.

它的效果也很好 - 除了第一行.出于某种原因总是错的.

#define FIELD_SIZE 50
int main(int argc, char** args){
    char* data = ReadFile("start.txt");

    char** map = (char**) malloc( FIELD_SIZE );

    if(map==NULL)
        __debugbreak();

    {
        int i;
        for(i = 0; i < FIELD_SIZE; i+=1){
            map[i] = (char*) malloc(FIELD_SIZE+1);

            if(map[i]==NULL)
                __debugbreak();
            //(FIELD_SIZE+1) in order to skip the '\n' at the end of each line.
            memcpy( &map[i][0], &data[i*(FIELD_SIZE+1)], FIELD_SIZE);
            map[i][FIELD_SIZE] = '\0';
        }
    }


    {
        int i;
        for(i = 0; i < FIELD_SIZE; i+=1){
            printf("%s\n", map[i]); //<-- prints …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers visual-studio-2010

3
推荐指数
1
解决办法
218
查看次数

Javascript无法在本地页面上运行

我有一个非常简单的webextension,当单击按钮时,它应该在新窗口中打开本地页面:

function openMyPage() {
    var popupURL = chrome.extension.getURL("my-page.html");

    chrome.windows.create({
      url: popupURL,
      type: "popup",
      height: 200,
      width: 200
    });
}

chrome.browserAction.onClicked.addListener(openMyPage);
Run Code Online (Sandbox Code Playgroud)

在my-page.html中,我想运行一些javascript,但无法正常运行。即使是简单的脚本也不会执行:

<html>
   <body>
     <script type="text/javascript">
        document.write("JS executed")
     </script>
   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

所打开页面的URL与相似moz-extension://8974747a-3aa7-4654-93e5-ad60d3de0cc5/my-page.html。我曾尝试禁用NoScript等插件,但无济于事。

如何在此页面上执行JS?我究竟做错了什么?谢谢你的帮助。

根据请求编辑:manifest.json:

{

  "description": "Adds browser action icon to toolbar to open packaged web page. See https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Examples#open-my-page-button",
  "manifest_version": 2,
  "name": "open-my-page",
  "version": "1.0",
  "homepage_url": "https://github.com/mdn/webextensions-examples/tree/master/open-my-page-button",
  "icons": {
    "48": "icons/page-48.png"
  },

  "applications": {
    "gecko": {
      "id": "open-my-page-button@mozilla.org",
      "strict_min_version": "45.0"
    }
  },

  "background": {
    "scripts": ["background.js"]
  },

  "browser_action": { …
Run Code Online (Sandbox Code Playgroud)

javascript firefox firefox-addon firefox-addon-webextensions

3
推荐指数
1
解决办法
3458
查看次数

在 QtQuick 2 应用程序中使用某些 Qt5 类时出现分段错误

在尝试使用某些 Qt-5 类时,我遇到了崩溃。我首先发现这个试图使用QFileSystemModel. 试图setRootPath立即呼叫会导致崩溃。调用堆栈没有多大帮助(所有这些都是汇编代码),QFileIconProvider::icon()只是在发生段错误之前调用的最后一个函数。

所以接下来我尝试QFileIconProvider手动使用- 毫不奇怪 - 它也使程序崩溃。

我正在使用 QtCreator 4,项目类型是“Qt Quick Application”。当我创建一个类型为“Qt Widgets Application”的项目时,我可以使用这两种方法QFileIconProvider并且QFileSystemModel没有问题。

这就是我没有想法的地方。我对Qt环境了解不够,不知道这两种类型的项目有什么区别会导致seg错误。

两个项目使用相同的工具包(相同的 gcc,相同的 Qt 5.6.1)和 QtCreator 设置的默认设置。

这是我的 project.pro 文件:

TEMPLATE = app

QT += qml quick widgets //default .pro file except for widgets
CONFIG += c++11

SOURCES += main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for …
Run Code Online (Sandbox Code Playgroud)

c++ qt qt5 qtquick2

2
推荐指数
1
解决办法
879
查看次数